[英]SUM Positions so that Higher is Better
我有三张桌子。 变更,讨论和对话。 每个讨论都有一个对话集合。 每个对话都是关于变化的。 然后,对话在讨论中排名1-10。 您最终将得到如下结果:
Conversations{
[ id: 1, discussion_id: 1, change_id 1, rank: 1 ],
[ id: 1, discussion_id: 1, change_id 3, rank: 3 ],
[ id: 1, discussion_id: 1, change_id 5, rank: 2 ],
[ id: 1, discussion_id: 1, change_id 2, rank: 4 ],
[ id: 1, discussion_id: 1, change_id 4, rank: 5 ],
[ id: 1, discussion_id: 2, change_id 3, rank: 1 ],
[ id: 1, discussion_id: 2, change_id 2, rank: 2 ],
[ id: 1, discussion_id: 2, change_id 4, rank: 5 ],
[ id: 1, discussion_id: 2, change_id 5, rank: 3 ],
[ id: 1, discussion_id: 2, change_id 1, rank: 4 ]
}
我想找到最高的得分变化。 我想到这个查询时就做到了:
SELECT changes.*, SUM(conversations.rank) AS score FROM "changes"
INNER JOIN "conversations" ON "conversations"."change_id" = "changes"."id"
GROUP BY changes.id
这将加总所有队伍。 这意味着越低越好。 但是,这种相当原始的解决方案有其缺陷:如果给一个更改赋予1和3等级,则最终得到的分数与给一个更改赋予4一样。
也许要解决此问题,您可以使其更高更好:第一名= 5分,第二名= 4分,依此类推。 我不知道该怎么实现。 这也可能不是最好的方法。
在这里,您可以找到用于上下文的SQL提琴。 仅供参考:我正在积极地开展这项工作。 我使用此生成查询:
Change.select("changes.*, SUM(conversations.rank) as conversations_rank").group("changes.id").joins(:conversations)
我想出了两种方法。 两者都很简单。 我只是有点傻:)
第一个,可能也是最简单的一个:
SELECT changes.name, SUM(11 - conversations.rank) as score FROM "changes"
INNER JOIN "conversations"
ON "conversations"."change_id" = "changes"."id"
GROUP BY changes.id
ORDER BY score desc
简单的数学 因此,如果sessions.rank = 1,那么它将是10,因为1减去11就是10。
也许更好的方法是拥有另一个表:
CREATE TABLE ranks (
rank INT UNSIGNED PRIMARY KEY,
value INT UNSIGNED
);
INSERT INTO ranks
VALUES (1, 5),
(2, 4),
(3, 3),
(4, 2),
(5, 1);
然后加入一个对sessions.rank的排名:
SELECT changes.name, SUM(ranks.value) as score FROM "changes"
INNER JOIN "conversations"
ON conversations.change_id = changes.id
INNER JOIN "ranks"
ON conversations.rank = r.rank
GROUP BY changes.name;
感谢您的所有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.