Если вы используете MySQL 8.0, вы можете использовать для этого оконные функции: ntile()
делает именно то, что вы просите. Предполагая, что ваш столбец упорядочивания - id
:
select *
from (select t.*, ntile(2) over(order by id) nt from mytable) t
where nt = 1
В более ранних версиях одним из вариантов является пользовательская переменная и соединение с агрегированным запросом:
select *
from (
select t.*, @rn := @rn + 1 rn
fom (select * from mytable order by id) t
cross join (select @rn := 0) x
cross join (select count(*) cnt from mytable) c
) t
where rn <= cnt / 2