LEFT JOIN Mehrfachergebnisse in einem Feld

F

foto50


Hallo, eine Frage ob jemand eine Möglichkeit in (My)SQL kennt, Mehrfachergebnisse der rechten Tabelle eines LEFT JOIN's gesammelt in einem Feld auszugeben.

Vereinfacht wäre da z.B. die Tabellen:

Code:
tbl_a:
+----+-------+
| id | text  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
|  3 | test3 |
+----+-------+

tbl_b:
+----+----------+
| id | tbl_a_id |
+----+----------+
|  1 |        1 |
|  2 |        1 |
|  3 |        2 |
|  4 |        3 |
|  5 |        3 |
|  6 |        1 |
+----+----------+

Mit einem einfachen LEFT JOIN kann ich mir nun die Anzahl der tbl_b.tbl_a_id für jede tbl_a.id ausgeben:

Code:
mysql> SELECT
    -> tbl_a.text,
    -> COUNT(tbl_b.id) AS id_anzahl
    -> FROM
    -> tbl_a LEFT JOIN tbl_b ON tbl_b.tbl_a_id = tbl_a.id
    -> GROUP BY
    -> tbl_a.id;
+-------+-----------+
| text  | id_anzahl |
+-------+-----------+
| test1 |         3 |
| test2 |         1 |
| test3 |         2 |
+-------+-----------+
3 rows in set (0.01 sec)

Ideal wäre nun, wenn ich auch gleich noch alle tbl_b.id pro Zeile in einem Feld hätte, welches ich bei einer späteren Abfrage in einem "FIND_IN_SET" verwenden könnte, also ein Ergebnis wie:

Code:
+-------+-----------+------------+
| text  | id_anzahl | tbl_b_id's |
+-------+-----------+------------+
| test1 |         3 | 1,2,6      |
| test2 |         1 | 3          |
| test3 |         2 | 4,5        |
+-------+-----------+------------+

Weis jemand, ob so ein Ergebnis überhaupt mit einer einzigen Abfrage möglich ist? Vielen Dank im voraus schon mal für eure Vorschläge!
 
Zuletzt bearbeitet von einem Moderator:

Hi

ich glaube nicht, dass es geht.
Habe in dieser Richtung auch schon einiges durchgetestet, auch mit Subselects.
Man müsste eine Scheife ziehen in einem Feld und das geht nicht, meines Wissens.

Letztlich entsprecht es auch nicht der Normalform, wenn man es so sieht.

Aber Du kannst eine solche Ausgabe in php oder ASP, also im Ausgabescripting herstellen, indem man die ID mit sich selbst vergleicht.
 
hpvw ... oh du mein Retter! Vielen Dank, genau das wars ... ;-)

Code:
mysql> SELECT
    -> tbl_a.text,
    -> COUNT(tbl_b.id) AS id_anzahl,
    -> GROUP_CONCAT(DISTINCT tbl_b.id
    -> ORDER BY tbl_b.id ASC SEPARATOR ',') AS tbl_b_ids
    -> FROM
    -> tbl_a LEFT JOIN tbl_b ON tbl_b.tbl_a_id = tbl_a.id
    -> GROUP BY
    -> tbl_a.id;
+-------+-----------+-----------+
| text  | id_anzahl | tbl_b_ids |
+-------+-----------+-----------+
| test1 |         3 | 1,2,6     |
| test2 |         1 | 3         |
| test3 |         2 | 4,5       |
+-------+-----------+-----------+
3 rows in set (0.01 sec)

Meine Prod-DB läuft bereits mit 4.1 ... wird höchste Zeit, daß ich die Dev-DB auch aufrüste :)

Luzie, das mit einer PHP-Schlaufe wäre ansonsten meine einzige Alternative gewesen, aber wenn ich an meine SQL-Anfänge denke (Viele Queries für wenig Daten) und das mit heute vergleiche, wäre ich (so wie eben) kaum überrascht, wenn es Abfragemöglichkeiten gibt, von denen ich sogar heute kaum zu träumen wage :)

Man lernt eben NIE aus ...
 
Puhh...

leider muss ich derzeitig noch scripttechnisch "Schlaufen" ziehen :D
mySQL und dessen aktuelle Funktionen, einfach sagenhaft :)
 
Zurück