【问题标题】:How to get rank based on SUM's?如何根据 SUM 获得排名?
【发布时间】:2010-05-25 20:55:16
【问题描述】:

我有存储所有内容的 cmets 表,我必须对所有内容求和并添加最佳答案 *10。 我需要整个列表的排名,以及如何显示指定用户/ID 的排名。

这里是 SQL:

   SELECT m.member_id AS member_id, 
          (SUM(c.vote_value) + SUM(c.best)*10) AS total
     FROM comments c
     LEFT JOIN members m ON c.author_id = m.member_id
     GROUP BY c.author_id
     ORDER BY total DESC
    LIMIT {$sql_start}, 20

【问题讨论】:

  • 我不明白 - 查询看起来不错。也许一些示例数据和预期输出会有所帮助?
  • 排名,如何显示排名,以及指定的UID

标签: mysql rank


【解决方案1】:

这样的事情怎么样:

SET @rank=0;
SELECT * FROM (
   SELECT @rank:=@rank+1 AS rank, m.member_id AS member_id, 
      (SUM(c.vote_value) + SUM(c.best)*10) AS total
   FROM comments c
   LEFT JOIN members m ON c.author_id = m.member_id
   GROUP BY c.author_id
   ORDER BY total DESC
) as sub
LIMIT {$sql_start}, 20

【讨论】:

  • 其实我不能用SET,它的ExpressionEngine和SQL模块不允许SET @rank=0;一切都必须在一行中,没有“;”
  • 在那种情况下,我不知道如何在 MySQL 中做到这一点。但是你可以从你的极限中得出排名,对吧?你只需要在你的程序而不是 MySQL 中计算排名。
【解决方案2】:

如果您的 MySQL 版本支持它们,您可能需要查看 windowing functions...

 SELECT m.member_id AS member_id, 
          (SUM(c.vote_value) + SUM(c.best)*10) AS total,
          RANK() OVER (ORDER BY (SUM(c.vote_value) + SUM(c.best)*10)) as ranking
     FROM comments c
     LEFT JOIN members m ON c.author_id = m.member_id
     GROUP BY c.author_id
     ORDER BY total DESC;

另一种可能性是这样的:

 SELECT m.member_id AS member_id, 
          (SUM(c.vote_value) + SUM(c.best)*10) AS total,
          (SELECT count(distinct <column you want to rank by>)
           FROM comments c1
           WHERE c1.author_id = m.member_id) as ranking
     FROM comments c
     LEFT JOIN members m ON c.author_id = m.member_id
     GROUP BY c.author_id
     ORDER BY total DESC;

注意:这方面有很多悬而未决的问题,但上述两种技术通常是确定排名的简单方法。您需要更改以上内容以满足您的确切需求,因为我对 member_id 排名的构成有点模糊。

【讨论】:

    【解决方案3】:
    SELECT
        @rank:=@rank+1 as rank,
        m.member_id AS member_id, 
        (SUM(c.vote_value) + SUM(c.best)*10) AS total
    FROM comments c,
    (SELECT @rank:=0) as init
    LEFT JOIN members m ON c.author_id = m.member_id
    GROUP BY c.author_id
    ORDER BY total DESC
    LIMIT {$sql_start}, 20
    

    在解决方案中,排名总是在增加,即使总数相同。

    【讨论】:

      猜你喜欢
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 2017-11-24
      • 2015-05-16
      相关资源
      最近更新 更多