Mysql ранжирование из двух таблиц - PullRequest
2 голосов
/ 12 сентября 2011

Итак, у меня есть две таблицы: «участие» и «голоса».Каждая строка в таблице «голосование» содержит «идентификатор участия», указывающий на участие, за которое был подан голос.

Теперь я хочу выбрать абсолютный рейтинг участника.основанный на количестве голосов, которые он имеет.

Обычно, это было бы просто, просто используя этот простой запрос:

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 Ответ

4 голосов
/ 12 сентября 2011

Вам нужно использовать переменную, которая увеличивается на каждую строку, и выбирать из результатов вашего запроса, например:

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 набор строк и добавляет к нему звание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...