0

我想按用户 ID 对表“记录”组的得分列求和,稍后我想比较每个用户的得分总和。为此,我写了以下查询

按用户汇总分数

Recording.select("sum(score) as score, user_id").group(:user_id).order("score DESC")

SELECT sum(score) as score, user_id FROM "recordings" GROUP BY user_id

比较总分

Recording.select("sum(score) as score, user_id").group(:user_id).where("score > 200")

SELECT sum(score) as score, user_id FROM "recordings" WHERE (score > 200) GROUP BY user_id

第二个查询不返回有效记录

4

1 回答 1

1

您没有评论 的角色score > 200,但我怀疑这就是您真正想要的:

SELECT sum(score) AS sum_score, user_id
FROM   recordings
GROUP  BY user_id
HAVING sum(score) > 200

这意味着,您希望总分(所有分数的总和)超过 200 的用户。您的查询将构建超过 200 的单个分数的总和。可能,但不太可能?

您通过使用列名作为聚合函数结果的别名为您的问题奠定了基础:

sum(score) as score

那是一把上膛的足枪。sum_score相反,我习惯于消除歧义。

通过将别名与基列混淆,您立即将自己击中了脚。您不能在WHEREorHAVING子句中引用列别名,只能引用基表。此外,您混淆了WHERE和的作用HAVING该手册有这方面的基础知识。.

于 2013-05-05T20:29:28.460 回答