получение ранжирования строк в инструкциях mysql ORDER BY - PullRequest
1 голос
/ 18 ноября 2011

предположим, у меня есть

SELECT * FROM t ORDER BY j

есть ли способ указать запрос, чтобы он также возвращал автоинкрементный столбец, который совпадает с результатами, определяющими ранг этой строки в терминах упорядочения?

также этот столбец также должен работать при использовании диапазонов LIMIT, например,

SELECT * FROM t ORDER BY j LIMIT 10,20

должен иметь автоинкрементный столбец, возвращающий 11,12,13,14 и т. Д.

1 Ответ

1 голос
/ 18 ноября 2011

Oracle, MSSQL и т. Д. Поддерживают функции ранжирования, которые делают именно то, что вы хотите, к сожалению, MySQL имеет некоторые возможности в этом отношении.

Самое близкое мне приближение к ROW_NUMBER() OVER() в MySQL выглядит следующим образом:

SELECT t.*, 
       @rank = @rank + 1 AS rank
FROM t, (SELECT @rank := 0) r
ORDER BY j

Я не знаю, как это будет оцениваться с использованием ранжированного LIMIT, если только вы не использовали его в подзапросе (хотя производительность может ухудшиться при работе с большими наборами данных)

SELECT T2.*, rank
FROM (
    SELECT t.*, 
           @rank = @rank + 1 AS rank
    FROM t, (SELECT @rank := 0) r
    ORDER BY j
    ) t2
LIMIT 10,20

Другой вариант - создать временную таблицу,

CREATE TEMPORARY TABLE myRank
(
     `rank` INT(11) NOT NULL AUTO_INCREMENT,
     `id` INT(11) NOT NULL,
     PRIMARY KEY(id, rank)
)

INSERT INTO myRank (id)
SELECT T.id
FROM T 
ORDER BY j

SELECT T.*, R.rank
FROM T
    INNER JOIN myRank R 
        ON T.id = R.id 
LIMIT 10,20

Конечно, временная таблица должна сохраняться между вызовами.

Хотелось бы, чтобы был лучший способ, но без ROW_NUMBER() вы должны прибегнуть к каким-то хакерским действиям, чтобы получить желаемое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...