Diese Art von Ergebnissen wird am besten von Fensterfunktionen in anderen RDBMS gehandhabt, aber leider hat Mysql keine Fensterfunktionen, daher gibt es alternativ eine Lösung, benutzerdefinierte Variablen zu verwenden, um Zeilen, die zur selben Gruppe gehören, einen Rang zuzuweisen
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
Die obige Abfrage gibt Ihnen 2 aktuelle Datensätze (auf Basis der ID) pro Kategorie. Sie können den letzten Teil der Abfrage mit der where-Klausel in eine beliebige Zahl ändern, um n Ergebnisse pro Gruppe anzuzeigen, zum Beispiel um 3 Datensätze anzuzeigen, dann WHERE c.rownum <= 3
und so weiter