繁体   English   中英

求和位置,以便更高更好

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM