我想按用户ID对表'录音'组的得分列进行求和,之后我想比较每个用户的得分总和。为此,我写了下面的查询
按用户加分
Recording.select(“总和(得分)为分数, user_id“)。group(:user_id).order(”score DESC“)
SELECT sum(score)as score,user_id FROM“recordings”GROUP BY user_id
比较得分总和
Recording.select(“总和(得分)为分数, user_id“)。group(:user_id).where(”score> 200“)
选择总和(得分)作为得分,user_id FROM“录音”WHERE(得分> 200)GROUP BY user_id
第二个查询不返回有效记录
答案 0 :(得分: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
来消除歧义。
通过混淆别名和基本列,你很快就把自己射中了脚。您不能在WHERE
或HAVING
子句中引用列别名,您只能引用基表。此外,您混淆了WHERE
和HAVING
的角色。 The manual has the basics about that.