Неправильные номера строк MySQL

#mysql

#mysql

Вопрос:

У меня есть следующая таблица в MySQL:

  -------------------------------------------------- 
   id  | type | recordTimeMS | created              
 -------------------------------------------------- 
   172 | 3    | 125015       | 2020-11-15 20:23:45  
   159 | 3    | 116828       | 2020-11-15 20:56:24  
   151 | 3    | 115015       | 2020-11-15 22:23:45  
   171 | 3    | 136828       | 2020-11-15 21:56:24  
  ....                                              
 -------------------------------------------------- 
 

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

 SELECT @row_number := @row_number   1 as rank, utr.id, utr.recordTimeMS, utr.created 
    FROM UserTimeRecord utr,
        (SELECT @row_number:=0) rn
    WHERE type = 3
    ORDER BY utr.recordTimeMS, utr.created
    LIMIT 10
 

Элементы упорядочены правильно, но ранг неверен, вот результат:

  -------------------------------------------------- 
   rank | id  | recordTimeMS | created              
 -------------------------------------------------- 
     3  | 151 | 115015       | 2020-11-15 22:23:45  
     2  | 159 | 116828       | 2020-11-15 20:56:24  
     1  | 172 | 125015       | 2020-11-15 20:23:45  
     4  | 171 | 136828       | 2020-11-15 21:56:24  
 -------------------------------------------------- 
 

Что вызывает это и есть ли другой способ сделать это?

Комментарии:

1. Если вы используете MySQL 8.0, вам следует использовать функцию ROW_NUMBER() window вместо пользовательской переменной.

2. ROW_NUMBER() работал как шарм и сделал все намного проще, если вы добавите его в свой ответ, я приму его. Заключительный рабочий запрос: ВЫБЕРИТЕ ROW_NUMBER() ПОВЕРХ (ПОРЯДОК ПО времени записи, создан) в качестве ранга, utr.id , utr.recordTimeMS, utr.создано ИЗ UserTimeRecord utr, ГДЕ type = 3 LIMIT 10

3. Вы можете опубликовать свой собственный ответ. У меня нет большого опыта в использовании оконных функций; Я знаю о них достаточно, чтобы рекомендовать их, но не писать код самостоятельно.

4. Вот почему я дал вам код в комментарии 🙂 но да, я опубликовал его сам, спасибо за помощь!

Ответ №1:

Спасибо @Barmar за то, что указал мне на ROW_NUMBER()-функцию, это сделало ее намного проще:

 SELECT ROW_NUMBER() OVER (ORDER BY recordTimeMS, created) as rank, 
        utr.id, utr.recordTimeMS, utr.created 
    FROM UserTimeRecord utr 
    WHERE type = 3 
    LIMIT 10 
 

И выдает правильный результат:

  -------------------------------------------------- 
   rank | id  | recordTimeMS | created              
 -------------------------------------------------- 
     1  | 151 | 115015       | 2020-11-15 22:23:45  
     2  | 159 | 116828       | 2020-11-15 20:56:24  
     3  | 172 | 125015       | 2020-11-15 20:23:45  
     4  | 171 | 136828       | 2020-11-15 21:56:24  
 -------------------------------------------------- 
 

Ответ №2:

Вам нужно выполнить упорядочение в подзапросе и вычисления номера строки в основном запросе.

В противном случае, в некоторых случаях MySQL @row_number сначала выполнит назначения, а затем выполнит упорядочение после замены их в результирующий набор.

 SELECT @row_number := @row_number   1 as rank, utr.id, utr.recordTimeMS, utr.created 
FROM (
    SELECT id, recordTimeMS, created
    FROM UserTimeRecord 
    WHERE type = 3
    ORDER BY recordTimeMS, created
    LIMIT 10
) AS utr,
(SELECT @row_number:=0) rn