Esses tipos de resultados são melhor tratados por funções de janela em outros RDBMS, mas infelizmente o Mysql não possui nenhuma função de janela, portanto, como alternativa, existe uma solução para usar variáveis definidas pelo usuário para atribuir uma classificação para linhas que pertencem ao mesmo grupo
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
A consulta acima fornecerá 2 registros recentes (com base no id) por categoria, você pode alterar a última parte da consulta com a cláusula where para qualquer número para mostrar n resultados por grupo, por exemplo, para mostrar 3 registros e então
WHERE c.rownum <= 3
e assim por diante Demo