【发布时间】:2019-12-31 02:06:03
【问题描述】:
我正在尝试使用 knex 编写一个查询来对每个问题的投票求和,但没有得到正确的总和。我可以用 SQL 编写子查询,但似乎无法将它们拼凑在一起。我是一名学生,不确定我是否对 Knex 做错了,或者我的基本逻辑是否错误。提前感谢您的帮助!
我的 knex 查询看起来像这样
return knex
.from('question')
.select(
'question.id AS question_id',
knex.raw(
`count(DISTINCT vote) AS number_of_votes`, //this returns the number_of_votes for each question_id as expected
),
knex.raw(
`sum(vote.vote) AS sum_of_votes`, //something wrong here... E.g., question_id 1 has 3 down votes so the sum should be -3, however I am getting -9
),
)
.leftJoin('user', 'question.user_id', 'user.id')
.leftJoin('vote', 'question.id', 'vote.question_id')
.groupBy('question.id', 'user.id');
有 3 个表格看起来像:
用户
- 身份证
- 用户名
问题
- 身份证
- 标题
- 身体
- user_id(FK 引用 user.id)
投票
- question_id(FK 引用 question.id)
- user_id(FK 引用 user.id)
- 投票(-1 或 1)
- 主键(question_id、user_id)
我确实设法将查询编写为独立的 SQL 查询,并验证它是否按预期工作。这就是我在上面的 knex 查询中想要完成的:
SELECT question.id, sum(vote.vote) AS sum_of_votes FROM question LEFT JOIN vote ON question.id = vote.question_id GROUP BY question.id;
【问题讨论】:
-
您的工作查询未加入
users,这可能会对结果产生影响。尝试从 knex 中删除用户加入,看看结果是否正确 -
附加输入,您的查询可能会在没有投票的情况下汇总问题,因为您正在对问题进行投票,有些问题尚未投票,结果将是
null,并且可能与Sum混淆,尝试将 sum 语句更改为Sum(IsNull(vote.vote, 0))。 -
嗯,这些似乎都不起作用。我认为正在发生的事情是投票总和乘以问题被投票的次数...回到问题 1 的示例有 3 票反对票(预计 -3 为 vote_sum)。它实际上被报告了 3 倍(对问题的每个投票实例一次),然后求和。但我不确定如何让它只报告每个问题的总和 1x。
标签: javascript sql knex.js