Вы можете смоделировать номер строки с использованием пользовательских переменных, а затем ограничить число строк и применить group_concat:
Рассмотрим следующую таблицу:
create table your_table (
id int primary key autoincrement,
category int,
value int
);
и данные:
insert into your_table (category, value)
values
(1, 1), (1, 2), (1, 3), (1, 4), (1, 5),
(2, 6), (2, 7), (2, 8), (2, 9), (2, 10),
(3, 11), (3, 12), (3, 13), (3, 14), (3, 15);
И мы хотим, чтобы это было верхнее 3 (в порядке последнего идентификатора) значение для каждой категории:
select category,
group_concat(value order by id desc) as value_con
from (
select t.*,
@rn := if(@category = category, @rn + 1, if(@category := category,1, 1)) as seqnum
from your_table t
cross join (select @category := null, @rn := 0) x
order by t.category, t.id desc
) t
where seqnum <= 3
group by category;
Выход:
category value_con
1 5,4,3
2 10,9,8
3 15,14,13
Вот демоверсия этого.