Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

1 zu n Relation zusammen fassen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von mpw1412, 12 Mai 2014.

  1. mpw1412

    mpw1412 Benutzer

    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
     
  2. ukulele

    ukulele Datenbank-Guru

  3. mpw1412

    mpw1412 Benutzer

    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
     
  4. mpw1412

    mpw1412 Benutzer

    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
     
  5. BerndB

    BerndB Datenbank-Guru

    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
     
    Walter gefällt das.
  6. ukulele

    ukulele Datenbank-Guru

    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.
     
  7. mpw1412

    mpw1412 Benutzer

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden