MySQL: SELECT mit INNER JOIN, doppelte Resultate vermeiden

mas666

Mitglied
Hallo zusammen

Ich habe eine Tabelle MEDIA und eine Tabelle AUTHOR. Ein Buch (also ein Eintrag in die MEDIA Tabelle) kann keinen, einen oder mehrere Autoren haben und mehrere Medien können denselben (oder dieselben) Autor(en) haben. Die Beziehung der beiden Tabellen ist über die Tabelle MEDIA_AUTHOR gelöst.

Die Tabellen verfügen (abgespeckt) über folgende Felder
Tabelle Media: MEDIA_ID, MEDIA_NAME
Tabelle Author: AUTHOR_ID, AUTHOR_NAME
Tabelle Media_Author: MEDIA_ID, AUTHOR_ID

Jetzt möchte zum Beispiel ich folgende Darstellung erreichen:

- Medium1, Autor1, Autor2, Autor3
- Medium2, Autor3
- Medium3, Autor1, Autor3
- Medium4

Ich benutze dazu folgendes SELECT Statement:

SQL:
SELECT * FROM media m LEFT JOIN (author a, media_author ma) ON (a.author_id=ma.author_id AND m.media_id = ma.media_id )

Ich kriege damit aber das Resultat

- Medium1, Autor1
- Medium1, Autor2
- Medium1, Autor3
- Medium2, Autor3
- Medium3, Autor1
- Medium3, Autor3
- Medium4, NULL

Wieso das so ist, ist mir klar, ich erwarte von dem Statement auch kein anderes Resultat. Ich habe allerdings keine Ahnung wie ich das oben dargestellte Resultat erreichen kann. Natürlich könnte ich in meinem Programm für jedes Medium die Autoren in einem separaten Statement abfragen, was ich aber aus Performancegründen nicht möchte.

Kann mir jemand dabei helfen ein Statement zu finden, das mir pro Resultat des einen Statements (alle Medien) für jede Resultatzeile (jedes gefundene Medium) alle über einen Fremdschlüssel verknüpfte Resultate eines zweiten Statements (alle Autoren) zurückgibt? Kurz: Eine Liste aller Medien und für jedes Medium eine Liste aller Autoren.

Herzlichen Dank fürs Lesen und mithelfen!

Gruss
soma
 
Zuletzt bearbeitet von einem Moderator:
In MySQL kannst du das über einen GROUP BY und dem Befehl GROUP_CONCAT()

SQL:
SELECT 
	m.media_name,
	GROUP_CONCAT(a.author_name ORDER BY a.author_name SEPARATOR ', ') AS authoren
FROM
	media m 
	LEFT JOIN media_author ma 
		ON m.media_id = ma.media_id
	LEFT JOIN author a, 
		ON a.author_id=ma.author_id
GROUP BY
	m.media_name
 
Zuletzt bearbeitet von einem Moderator:
Hey Yaslaw

Vielen Dank. Das löst genau mein Problem.
Du hast in Deinem Beispiel ein Komma zuviel gesetzt (nach dem zweiten LEFT JOIN, vor ON).

So stimmt's.
SQL:
SELECT 
    m.media_name,
    GROUP_CONCAT(a.author_name ORDER BY a.author_name SEPARATOR ', ') AS authoren
FROM
    media m 
    LEFT JOIN media_author ma 
        ON m.media_id = ma.media_id
    LEFT JOIN author a 
        ON a.author_id=ma.author_id
GROUP BY
    m.media_name

Vielen Dank für die Antwort und dass Du trotz dem unformatierten SQL meinen Beitrag gelesen hast ;-)

Gruss
mas
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück