Denna typ av resultat hanteras bäst av fönsterfunktioner i andra RDBMS men tyvärr har Mysql inga fönsterfunktioner så alternativt finns det en lösning att använda användardefinierade variabler för att tilldela en rangordning för rader som tillhör samma grupp
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
Ovanstående fråga ger dig 2 senaste poster (på basis av id) per kategori. Du kan ändra den sista delen av frågan med where-sats till valfritt antal för att visa n resultat per grupp, till exempel för att visa 3 poster sedan WHERE c.rownum <= 3
och så vidare