Mysql从两个表中排名

时间:2011-09-12 14:23:36

标签: mysql sql database

所以我有两张桌子,“参与”和“投票”。 表“投票”中的每一行都包含一个“participation_id”来引用投票所参与的参与。

现在,我希望能够根据参与票数选择绝对参与排名。

通常,只需使用这个简单的查询就可以了:

SELECT p.id, COUNT(v.id) as votes 
FROM participations as p 
JOIN votes as v on p.id = v.participation_id 
GROUP BY v.participation_id 
ORDER BY votes DESC;

但是,我必须能够在某处添加一些WHERE子句。所以,如果我这样做,我将获得相对排名(即相对于过滤行集的排名)

有人知道这只是一个查询是否可行!? (允许使用当前子查询)我希望这个问题对任何人都有意义。

1 个答案:

答案 0 :(得分:4)

您需要使用一个变量,每行递增一次,并从查询结果中选择,如下所示:

SET @rank := 0;
SELECT id, votes, rank
from (
  SELECT id, votes, (@rank := @rank + 1) as rank
  from (
    SELECT p.id, COUNT(v.id) as votes 
    FROM participations as p 
    JOIN votes as v on p.id = v.participation_id
    WHERE ... -- add your where clause, if any, here to eliminate completely from results
    GROUP BY v.participation_id 
    ORDER BY votes DESC
  ) x
) y
-- Now join to apply filtering to ranked results, for example:
JOIN participations p1 on p1.id = y.id
where p1.date between '2011-06-01' and now(); -- just making up an example
and p1.gender = 'female'; -- for example

一些解释:

短语(@rank := @rank + 1)增加变量返回增量的结果,该结果已被赋予别名rank

最后的x是查询结果的别名,并且是语法所必需的(但任何别名都会这样做 - 我只选择了x)。有必要使用内部查询,因为这是提供排序的 - 在完成之前你不能添加排名。

注意:
任何where子句或其他所需的处理顺序必须在内部查询中进行 - 外部查询仅 进行排名处理 - 它需要 final 查询行集并为其添加排名。