Bei einer normalen SELECT Abfrage bietet MySQL die Möglichkeit einer zugeordneten Gruppierung von Werten aus einer anderen Tabelle, ohne das dafür eine zweite Abfrage vorgenommen werden muss. Die Zauberworte hierfür sind im folgenden Beispiel "GROUP_CONCAT" und "JOIN" (oder auch LEFT OUTER JOIN).
Folgende Abfrage soll umgesetzt werden: Zeige mir alle Datensätze, die zu einer Kategorie gehören. Konkret in diesem Fall, alle Newsbeiträge zu allen Newskategorien.
SELECT
tt_news_cat.uid AS cat_id,
GROUP_CONCAT(DISTINCT tt_news.uid ORDER BY tt_news.uid DESC SEPARATOR ',') AS news_id
FROM tt_news
LEFT OUTER JOIN tt_news_cat_mm ON tt_news.uid = tt_news_cat_mm.uid_local
LEFT OUTER JOIN tt_news_cat ON tt_news_cat.uid = tt_news_cat_mm.uid_foreign
GROUP BY tt_news_cat.uid
-- Result:
-- +--------+------------+
-- | cat_id | news_id |
-- +--------+------------+
-- | 1 | 1,2,3,4 |
-- | 2 | 5,6 |
-- | 3 | 7,8,9,10 |
-- | 4 | 11,12 |
-- +--------+------------+
Die Syntax der GROUP_CONCAT Funktion ist folgendermaßen aufgebaut:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])
Desweiteren sollte beachtet werden, das die maximale Zeichenanzahl der GROUP_CONCAT - Spalte auf eine Länge von 1024 Zeichen begrenzt ist. Sollte dies nicht ausreichen, kann man in der mysql.conf die Systemvariable group_concat_max_len an seine Bedürfnisse anpassen.