所以我有两张桌子,“参与”和“投票”。 表“投票”中的每一行都包含一个“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子句。所以,如果我这样做,我将获得相对排名(即相对于过滤行集的排名)
有人知道这只是一个查询是否可行!? (允许使用当前子查询)我希望这个问题对任何人都有意义。
答案 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 查询行集并为其添加排名。