Рейтинг не обновляется по сериалу - PullRequest
2 голосов
/ 04 мая 2019

Я хочу обновить свой столбец ранга по порядку сортировки.Но так не сортируется.

enter image description here

Я хочу Рейтинг будет 1 для первого ряда и 2 для второго ряда.

user_teams

user_id |match_id |team_earning_point

enter image description here

user_team_contests

user_id | user_team_id |test_id

enter image description here

В обеих таблицах Id является первичным ключом

вот мой sql код:

Set @a=0;
SELECT  u_t.id,u_t.match_id,u_t.team_earning_point, @a:=@a+1 as ranking
FROM user_teams AS u_t, user_team_contests as u_t_c
WHERE u_t_c.contest_id=21  AND u_t.id = u_t_c.user_team_id
ORDER BY u_t.team_earning_point DESC, u_t_c.created_at ASC

Где изменить мой коддля получения точного результата?

1 Ответ

3 голосов
/ 04 мая 2019

Переменные в MySQL привередливы.Вы должны сделать order by перед назначением переменной:

SELECT ut.*, (@rn := @rn + 1) as ranking
FROM (SELECT u_t.id u_t.match_id, u_t.team_earning_point 
      FROM user_teams u_t JOIN
           user_team_contests u_t_c
           ON u_t.id = u_t_c.user_team_id
      WHERE u_t_c.contest_id = 21 
      ORDER BY u_t.team_earning_point DESC, u_t_c.created_at ASC
     ) ut CROSS JOIN
     (SELECT @rn := 0) params;

Вы заметите, что я также исправил синтаксис архаичного соединения.Вы всегда должны использовать JOIN / ON для выражения объединений.

Конечно, в MySQL 8+ вы просто должны использовать:

row_number() over (partition by u_t_c.contest_id order by u_t.team_earning_point DESC, u_t_c.created_at) as ranking
...