1 zu n Relation zusammen fassen

mpw1412

Benutzer
Beiträge
6
Hallo,

ich hab hier 3 Tabellen, aus denen ich Informationen in eine große Liste zusammen selektiere:

- Haupttabelle A, enthält unter anderem eine relations_ID
- Tabelle B, enthält zu der relations_ID bis zu n Relationen
- Tabelle C, läst die n Relationen aus B alphanumerisch auf, also gibt der Relation einen Namen

Derzeit arbeite ich mit normalen joins, was zur Folge hat, dass ich die Einträge doppelt habe, wenn es mehr als eine verknüpfte Relation gibt:

Haupteintrag 1 | Relation 1
Haupteintrag 1 | Relation 2
Haupteintrag 2 | Relation 1
Haupteintrag 2 | Relation 3
Haupteintrag 3 | Relation 4

Was ich nun aber möchte ist folgendes:

Haupteintrag 1 | Relation 1, Relation 2
Haupteintrag 2 | Relation 1, Relation 3
Haupteintrag 3 | Relation 4

Wie könnte ich diese Gruppierung anstellen? Ich hab schon ein wenig gegoogelt, komme aber nicht recht weiter. Ein Stichwort wäre evtl. hilfreich.

Grüße
MPW
 
Werbung:
Hallo,

danke für den Link. GROUP_CONCAT scheint auf jeden Fall das richtige Stichwort zu sein.

Leider bekomme ich es nicht hin. In Fall 1 hab ich in jeder Zeile alle Relationen, egal ob sie verknüpft sind, oder nicht. Und in Fall 2 bekomme ich immer nur eine Bezeichnung. Irgendwas läuft da schief. Hier mal die gesamten Querys:

Code:
SELECT
    veranstaltungen.veranstaltung_id, veranstaltungen.bezeichnung,
    veranstaltungen.Freischaltung_Anfang, veranstaltungen.Freischaltung_Ende,
    veranstaltungstyp.bezeichnung,seminargruppen.bezeichnung,
    CASE
        WHEN modulveranstaltungzo.modul_id = 1171 THEN "Tutoriumsmodul aktiv"
        WHEN modulveranstaltungzo.modul_id IS NULL THEN "Kein Tutoriumsmodul"
        ELSE "Fehler"
    END ,
    bezeichnungen
FROM `veranstaltungen`
    LEFT JOIN veranstaltungstyp ON (veranstaltungen.typ_id = veranstaltungstyp.typ_id)
    LEFT JOIN seminargruppen ON (veranstaltungen.seminargruppe_id = seminargruppen.seminargruppe_id)
    LEFT JOIN modulveranstaltungzo
        ON (veranstaltungen.veranstaltung_id LIKE modulveranstaltungzo.veranstaltung_id
            AND modulveranstaltungzo.modul_id = 1171
            AND modulveranstaltungzo.aktiv = 1)
    LEFT JOIN studiengangveranstaltungzo ON (veranstaltungen.veranstaltung_id LIKE studiengangveranstaltungzo.veranstaltung_id)
    LEFT JOIN
        (SELECT GROUP_CONCAT(bezeichnung ) AS bezeichnungen FROM studiengang) studiengangveranstaltungzo
            ON (studiengangveranstaltungzo.studiengang_id = studiengang_id)
        GROUP BY veranstaltungen.veranstaltung_id
;

Und das hier liefert immer nur eine Relation:

Code:
SELECT
    veranstaltungen.veranstaltung_id, veranstaltungen.bezeichnung,
    veranstaltungen.Freischaltung_Anfang, veranstaltungen.Freischaltung_Ende,
    veranstaltungstyp.bezeichnung,seminargruppen.bezeichnung,
    CASE
        WHEN modulveranstaltungzo.modul_id = 1171 THEN "Tutoriumsmodul aktiv"
        WHEN modulveranstaltungzo.modul_id IS NULL THEN "Kein Tutoriumsmodul"
        ELSE "Fehler"
    END ,
    (SELECT GROUP_CONCAT(studiengang.bezeichnung ) FROM studiengang WHERE veranstaltungen.seminargruppe_id = studiengang.studiengang_id )
FROM `veranstaltungen`
    LEFT JOIN veranstaltungstyp ON (veranstaltungen.typ_id = veranstaltungstyp.typ_id)
    LEFT JOIN seminargruppen ON (veranstaltungen.seminargruppe_id = seminargruppen.seminargruppe_id)
    LEFT JOIN modulveranstaltungzo
        ON (veranstaltungen.veranstaltung_id LIKE modulveranstaltungzo.veranstaltung_id
            AND modulveranstaltungzo.modul_id = 1171
            AND modulveranstaltungzo.aktiv = 1)
    LEFT JOIN studiengangveranstaltungzo ON (veranstaltungen.veranstaltung_id LIKE studiengangveranstaltungzo.veranstaltung_id)
GROUP BY veranstaltungen.veranstaltung_id
;

Zur Einordnung des Namensraums: Es geht um eine Evaluationssoftware, wo Uni-Veranstaltungen bewertet werden.

Grüße
MPW
 
Also ich hab es jetzt mal auf ein Minimalbeispiel reduziert, dass verdeutlich, wo ich hänge:

Code:
SELECT
  veranstaltungen.veranstaltung_id,
  (SELECT GROUP_CONCAT(studiengang.bezeichnung ) FROM studiengang WHERE studiengangveranstaltungzo.studiengang_id = studiengang.studiengang_id )   
FROM `veranstaltungen`
  LEFT JOIN studiengangveranstaltungzo ON (veranstaltungen.veranstaltung_id LIKE studiengangveranstaltungzo.veranstaltung_id)
;

Das gibt mir eine Liste aus Veranstaltungs-IDs und Studiengangsbezeichnungen, wobei eben die Veranstaltungs-IDs mehrfach auftauchen. So wie ganz ursprünglich oben beschrieben und als ob GROUP_CONCAT nicht dabei wäre.

Sobald ich jetzt am Ende ein
Code:
GROUP BY veranstaltungen.veranstaltung_id

einfüge, bekomme ich jede Veranstaltungs-ID nur einmal - so wie gewünscht - aber auch nur eine Bezeichnung dahinter. Es findet kein aneinanderfügen statt.

Was mache ich falsch?

Grüße
MPW
 
Hallo,

hier nur kurz die Lösung

MariaDB [test]> SELECT v.vtext, GROUP_CONCAT(s.`bezeichnung`) AS bezeichnung
-> FROM veranstaltungen v
-> LEFT JOIN studiengang s ON s.`studien_id` = v.`id`
-> GROUP BY v.id;
+----------------+----------------+
| vtext | bezeichnung |
+----------------+----------------+
| Haupteintrag 1 | bez1,bez2 |
| Haupteintrag 2 | bez3,bez7,bez4 |
| Haupteintrag 3 | bez6,bez5 |
+----------------+----------------+
3 rows in set (0.31 sec)


Die beispieltabellen sehen so aus

MariaDB [test]> select * from veranstaltungen;
+----+----------------+
| id | vtext |
+----+----------------+
| 1 | Haupteintrag 1 |
| 2 | Haupteintrag 2 |
| 3 | Haupteintrag 3 |
+----+----------------+
3 rows in set (0.68 sec)

MariaDB [test]> select * from studiengang;
+----+------------+-------------+
| id | studien_id | bezeichnung |
+----+------------+-------------+
| 1 | 1 | bez1 |
| 2 | 1 | bez2 |
| 3 | 2 | bez3 |
| 4 | 2 | bez4 |
| 5 | 3 | bez5 |
| 6 | 3 | bez6 |
| 7 | 2 | bez7 |
+----+------------+-------------+
7 rows in set (0.06 sec)

Gruss

Bernd
 
Das von Bernd sieht gut aus, GROUP_CONCAT wird auf jedenfall ganz normal im Select verwendet. Bei dir sind es immer wieder Subselects. Leider hab ich hier kein MySQL laufen, nur MSSQL und damit kann ich es nicht testen.
 
Werbung:
Vielen Dank euch beiden für die Hilfe. Ich hatte irgendwo gefunden, dass man GROUP_CONCAT in Kombination mit Joins so verwenden muss. Egal, es klappt und so ist es sogar einfacher und strukturierter.
 
Zurück
Oben