#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