В стандарте ISO SQL 2003 или более поздней версии я бы использовал ROW_NUMBER() OVER ( ORDER BY id )
в сочетании с OFFSET
. Этот запрос работает в SQL Server 2012 или более поздней версии, Oracle 10g или более поздней версии, PostgreSQL или MySQL 8 или более поздней версии - но вряд ли кто-либо использует MySQL 8 ...
Для вашего первого примера:
SELECT
employee.*
FROM
(
SELECT
id,
ROW_NUMBER() OVER ( ORDER BY id ) AS rn
FROM
employee
) AS sq
INNER JOIN employee ON employee.id = sq.id
ORDER BY
id
OFFSET
0 ROWS FETCH 4
К счастью, MySQL позволяет увеличивать переменные и оценивать другие нечистые выражения в SELECT
, как если бы они вычислялись итеративно (это неверное предположение для «мышления SQL»).
Итак, вот хитрость для получения ранга строки в MySQL, используя встроенную инициализацию :
SELECT
*,
@rank := @rank + 1 AS rn
FROM
employee,
( SELECT @rank := 0 )
ORDER BY
employee.id
Так что мы можем использовать это как наш подзапрос:
SELECT
employee.*
FROM
(
SELECT
employee.id,
@rank := @rank + 1 AS rn
FROM
employee,
( SELECT @rank := 0 )
ORDER BY
employee.id
) AS sq
INNER JOIN employee ON employee.id = sq.id
ORDER BY
id
LIMIT
4 OFFSET 0