Вы используете версию MySQL ранее, чем 8+, что означает, что вы не можете использовать аналитические функции здесь. Вот один из способов сделать это, используя коррелированный подзапрос с выражением CASE
:
SELECT t1.id, t1.name
FROM yourTable t1
ORDER BY
CASE WHEN (SELECT COUNT(*) FROM yourTable t2 WHERE t2.id <= t1.id) <= 4
THEN 0
ELSE 1 END,
CASE WHEN (SELECT COUNT(*) FROM yourTable t2 WHERE t2.id <= t1.id) <= 4
THEN id
ELSE -id END;
Демо
Причина, по которой я вычисляю номер строки выше с помощью коррелированного подзапроса, а не просто с помощью id
, заключается в том, что, возможно, ваши значения id
могут не всегда начинаться с 1
или даже быть смежными. Номер строки всегда может правильно указывать на записи первой строки, как , упорядоченный по id
, тогда как само значение id
может не всегда быть достаточным.
Обратите внимание, что аналитические функции значительно упрощают чтение кода. Вот что вы можете сделать с MySQL 8 +:
SELECT t1.id, t1.name
FROM yourTable t1
ORDER BY
CASE WHEN ROW_NUMBER() OVER (ORDER BY id) <= 4 THEN 0 ELSE 1 END,
CASE WHEN ROW_NUMBER() OVER (ORDER BY id) <= 4 THEN id ELSE -id END;