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()
вы должны прибегнуть к каким-то хакерским действиям, чтобы получить желаемое поведение.