Ce type de résultats est mieux géré par les fonctions de fenêtre dans d'autres SGBDR, mais malheureusement, Mysql n'a pas de fonctions de fenêtre, donc comme alternative, il existe une solution pour utiliser des variables définies par l'utilisateur pour attribuer un rang aux lignes appartenant au même groupe
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 requête ci-dessus vous donnera 2 enregistrements récents (sur la base de l'identifiant) par catégorie, vous pouvez modifier la dernière partie de la requête avec la clause where en n'importe quel nombre pour afficher n résultats par groupe, par exemple pour afficher 3 enregistrements, puis WHERE c.rownum <= 3
et ainsi de suite