2010-05-25 83 views
1

我有评论表,其中的一切都存储,我必须汇总一切,并添加BEST ANSWER * 10。 我需要排列整个列表,以及如何显示指定用户/ ID的排名。如何获得基于SUM的排名?

这里是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 
+1

我不明白 - 查询看起来很好。也许一些样本数据和预期产出会有所帮助? – 2010-05-25 20:59:02

+0

Rank,如何显示排名,以及指定的UID – Kenan 2010-05-25 20:59:46

回答

0

怎么是这样的:

SET @rank=0; 
SELECT * FROM (
    SELECT @rank:[email protected]+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 
+0

其实我不能使用SET,它的ExpressionEngine和SQL模块不允许SET @ rank = 0;一切都必须在一条线上,不要“;” – Kenan 2010-05-25 21:04:09

+0

在这种情况下,我不知道如何在MySQL中做到这一点。但是你可以从你的极限中获得等级,对吧?你只需要在程序中而不是在MySQL中计算排名。 – Wolph 2010-05-26 00:28:22

0

你可能想看看windowing functions如果你的MySQL版本支持他们......

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的排名构成了一点模糊。

0
SELECT 
    @rank:[email protected]+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 

在该解决方案中,即使总数相同,排名也始终在增加。