У меня есть следующий запрос, который возвращает некоторые сведения о событии, количество голосов и ранг.
SELECT e.guid,
e.name,
(SELECT COUNT(ev.event_vote_id)
FROM event_vote sv
WHERE ev.event_uid = s.guid) AS votes,
@curRank := @curRank + 1 AS rank
FROM event e, (SELECT @curRank := 0) r
ORDER BY votes DESC
Он возвращает правильные данные, включая голоса, но ранг сломан.
Фактический результат
guid | name | votes | rank
def test2 2 2
abc test1 1 1
ghi test3 0 3
jkl test4 0 4
ожидаемый результат
guid | name | votes | rank
def test2 2 1
abc test1 1 2
ghi test3 0 3
jkl test4 0 4
По какой-то причине test1 имеет более высокий ранг, чем test2.
Я предполагаю, что мне нужно использовать JOIN, но я не уверен в синтаксисе.
Сначала вам нужно рассчитать голоса, а затем рассчитать рейтинг.
SELECT T.*, @curRank := @curRank + 1 AS rank
FROM ( SELECT e.guid,
e.name,
(SELECT COUNT(ev.event_vote_id)
FROM event_vote sv
WHERE ev.event_uid = s.guid) AS votes
FROM event e
) as T
CROSS JOIN (SELECT @curRank := 0) r
ORDER BY votes DESC
У вас неправильный результат, потому что секция SELECT
возникает до раздела ORDER
, поэтому у вас уже есть ранг, но не обязательно соответствует порядку, который вы получите в конце.
Подробнее об этом читайте здесь: