Вам нужно использовать переменную, которая увеличивается на каждую строку, и выбирать из результатов вашего запроса, например:
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 или другой порядок обработки, который вы хотите, должен выполняться в запросе inner - внешний запрос only для обработки ранга - он принимает запрос final набор строк и добавляет к нему звание.