mysql левый внешний рейтинг - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь ранжироваться с помощью левого внешнего соединения

Мой sql:

SET @rank=0;

SELECT @rank:=@rank+1 AS rank, h.name, COUNT(v.hId) AS votes
  FROM users h LEFT OUTER JOIN users_votes v ON h.id = v.hId GROUP BY h.id
 ORDER BY rank ASC
;

Правильнее было бы вернуться вот так

rank |  name    |   votes

1   Luck        4   
2   Marc        3
3   Santos      2
4   Matheus     0

Но это неверный путь:

rank |  name    |   votes

1   Santos      2   
2   Marc        3
3   Luck        4
4   Matheus     0

Ответы [ 3 ]

0 голосов
/ 03 апреля 2020

В MySQL 8+ вы должны использовать row_number():

SELECT ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) as rank,
       h.name, COUNT(*) AS votes
FROM users h LEFT OUTER JOIN
     users_votes v
     ON h.id = v.hId
GROUP BY h.id
ORDER BY rank ASC;

Переменные устарели в 8 +.

В более ранней версии вы можете использовать переменные, но они склонны не уважать ORDER BY или GROUP BY. Итак, с этими конструкциями вам нужен подзапрос:

SELECT (@rn := @rn + 1) as rank, hv.*
FROM (SELECT h.name, COUNT(*) AS votes
      FROM users h LEFT OUTER JOIN
           users_votes v
           ON h.id = v.hId
      GROUP BY h.id
      ORDER BY rank ASC
     ) hv CROSS JOIN
     (SELECT @rn := 0) params;
0 голосов
/ 04 апреля 2020

Не работает, неправильный номер ранга. Я хочу отсортировать по голосам и оценить наиболее проголосовавших

0 голосов
/ 03 апреля 2020

Вы заказываете ASC способом, измените его на DESC. Как это:

SET @rank=0;

SELECT @rank:=@rank+1 AS rank, h.name, COUNT(v.hId) AS votes
  FROM users h LEFT OUTER JOIN users_votes v ON h.id = v.hId GROUP BY h.id
 ORDER BY rank DESC
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...