Tego typu wyniki są najlepiej obsługiwane przez funkcje okna w innych RDBMS, ale niestety Mysql nie ma żadnych funkcji okna, więc alternatywą jest rozwiązanie polegające na użyciu zmiennych zdefiniowanych przez użytkownika do przypisywania rangi wierszom należącym do tej samej grupy
SELECT `id`, `category`, `names`
FROM (
SELECT *,
@r:= CASE WHEN @g = category THEN @r + 1 ELSE 1 END rownum,
@g:=category
FROM test
CROSS JOIN(SELECT @g:=NULL ,@r:=0) t
ORDER BY category,id desc
) c
WHERE c.rownum <=2
Powyższe zapytanie da ci 2 ostatnie rekordy (na podstawie id) na kategorię, możesz zmienić ostatnią część zapytania z klauzulą WHERE na dowolną liczbę, aby wyświetlić n wyników na grupę, na przykład, aby pokazać 3 rekordy, a następnie WHERE c.rownum <= 3
i tak dalej