MySQL Broken Rank

0

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

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, но я не уверен в синтаксисе.

Теги:
database
select
join

1 ответ

2
Лучший ответ

Сначала вам нужно рассчитать голоса, а затем рассчитать рейтинг.

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, поэтому у вас уже есть ранг, но не обязательно соответствует порядку, который вы получите в конце.

Подробнее об этом читайте здесь:

Порядок выполнения SQL-запроса

  • 0
    Спасибо, это работает, я думал, что это так.
  • 0
    Я хочу сделать этого пользователя конкретным, присоединившись к user_event. Я добавил "ПРИСОЕДИНЯЙТЕСЬ к user_event ue ON t.guid = ue.selfie_uid WHERE ue.user_uid = '33c2fb85'" после AS T, но это дает мне противоположный ответ (события, НЕ связанные с пользователем). Любая помощь будет оценена. Благодарю.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню