Questo tipo di risultati sono gestiti al meglio dalle funzioni della finestra in altri RDBMS ma sfortunatamente Mysql non ha alcuna funzione della finestra, quindi in alternativa esiste una soluzione per utilizzare variabili definite dall'utente per assegnare un rango alle righe che appartengono allo stesso gruppo
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
La query sopra ti darà 2 record recenti (sulla base dell'id) per categoria puoi cambiare l'ultima parte della query con la clausola where in qualsiasi numero per mostrare n risultati per gruppo, ad esempio per mostrare 3 record, quindi WHERE c.rownum <= 3
e così via