Как это сделать, указав c sql левое соединение с помощью секвелирования? - PullRequest
0 голосов
/ 09 февраля 2020

Я попытался создать структуру БД для системы голосования, используя секвелизацию, как показано ниже:

PollAnswer = sequelize.define('PollAnswer', {answer: DataTypes.STRING});
PollQuestion = sequelize.define('PollQuestion', {question: DataTypes.STRING});
VotingHistory = sequelize.define('VotingHistory', {});
User = sequelize.define('User', {name: DataTypes.STRING});

PollAnswer.belongsTo(PollQuestion); //every question has many answers
VotingHistory.belongsTo(PollQuestion);
VotingHistory.belongsTo(PollAnswer);
VotingHistory.belongsTo(User);

Я хочу написать запрос, чтобы получить ответы на конкретный c вопрос и их голосование. подсчитывает в таблице VotingHistory , я сделал это с помощью следующей команды sql, и ответ был таким, как я ожидал:

select count(VotingHistory.PollAnswerId), PollAnswer.answer from PollAnswers
left join VotingHistories on PollAnswer.id = VotingHistory.PollAnswerId group by PollAnswers.id

ожидаемый ответ:

answer    count
------------
ans1       10
ass2       2
ans3       0

Но при использовании sequelize для запросите то же самое, как показано ниже:

VotingHistory.findAll({
  where:{PollQuestionId: req.params.poll},
  attributes:[[sequelize.fn('count', sequelize.col('PollAnswerId')), 'count']],
  group:['PollAnswerId'],
  include:[{
    model:PollAnswer,
    attributes:['id','answer']
  }]
})

он просто возвращает это:

answer    count
------------
ans1       10
ass2       2

мой вопрос: как я могу получить ожидаемый ответ, который выше sql команда запрос возвращает, используя sequelize?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Разве это не просто "опечатка"? r отсутствует в attributes.

Если нет, пожалуйста, посмотрите следующее:

Вы пытались записать, какой запрос генерирует ваш скрипт? Вы можете сделать это, добавив logging: console.log к своей конфигурации:

VotingHistory.findAll({
  logging: console.log,
  where:{PollQuestionId: req.params.poll},
  attributes:[[sequelize.fn('count', sequelize.col('PollAnswerId')), 'count']],
  group:['PollAnswerId'],
  include:[{
    model:PollAnswer,
    attributes:['id','answer']
  }]
})

Однако я подозреваю, что ваша проблема в том, что вы используете PollAnswerId вместо PollAnswer.id

VotingHistory.findAll({
  logging: console.log,
  where:{PollQuestionId: req.params.poll},
  attributes:[[sequelize.fn('count', sequelize.col('PollAnswer.id')), 'count']],
  group:['PollAnswer.id'],
  include:[{
    model:PollAnswer,
    attributes:['id','answer']
  }]
})
0 голосов
/ 09 февраля 2020

Вам следует использовать PollAnswer.findAll, sequelize.fn и включить PollHistory, см. аналогичное решение

...