MySQL: n:m Beziehung abfragen / Verständnisproblem

norbert_pdm

Grünschnabel
Hallo, hallo liebe Lesende,

ich habe 3 Tabellen, die untereinander mit einer n:m Beziehung bzw. einer 1:n Beziehung verbunden sind.
Hier mal der relevante Aufbau als Minimalbeispiel:
(Mir fällt beim schreiben gerade auf, dass man die Relation auch mit rel hätte beschriften können ;))

HTML:
tbl_type            tbl_doku_gruppe                tbl_ma_has_dokugru     tbl_ma

type_ID | typ_kurz  dg_ID | doku_date  | type_ID   dg_ID | ma_ID          ma_ID | Vor | Nach
------------------  ---------------------------    -------------          ---------------------
1       | Gru       1     | 2021-02-01 | 1         1     | 1              1      | Max | Müller
2       | Einzel    2     | 2021-02-02 | 2         1     | 2              2      | Eva | Meyer
3       | Info      3     | 2021-02-03 | 2         2     | 1              3      | Ida | Schulz

Ich habe jetzt eine Abfrage, die so aussieht:
SQL:
SELECT
    DATE_FORMAT(dokugru.doku_date, '%d.%m.%Y') AS Datum,
    GROUP_CONCAT(CONCAT(ma.Vor, ' ', ma.Nach) SEPARATOR ' | ' ) AS Mitarbeiter   
FROM
    tbl_ma_has_dokugru magruppe
    LEFT JOIN tbl_ma ma ON ma.ma_ID = magruppe.ma_ID
    LEFT JOIN tbl_doku_gruppe dokugru ON dokugru.dg_ID = magruppe.dg_ID
WHERE
    DATE_FORMAT(dokugru.doku_date, '%m') = MONTH(NOW())
GROUP BY
    magruppe.dg_ID

Zum einen krieg ich es nicht hin, den Typ mit auszugeben (wird ja oben auch nicht mit abgefragt, aber alle Konstrukte von mir gingen schief) und zum anderen werden die Elemnete die keinen Eintrag in der Tabelle 'tbl_ma_has_dokugru' (zB Nr 3) nicht mit angezeigt. Letzteres erscheint mir schon auch iwie logisch... Aber wie könnte ich es trotzdem erreichen?

Danke schon mal wieder für eure Überlegungen und Hilfen,
Norbert
 
Falsche Master-Table.
Du musst dokugru als Master-Table nehmen (also in den FROM-Abschnitt), und von dort die LEFT JOINS auf die m:n-Tabelle.

Ungetestet!
SQL:
SELECT
tbtype.typ_kurz,
DATE_FORMAT(dokugru.doku_date, '%d.%m.%Y') AS Datum,
GROUP_CONCAT(CONCAT(ma.Vor, ' ', ma.Nach) SEPARATOR ' | ' ) AS Mitarbeiter  
FROM
tbl_type tbtype INNER JOIN tbl_doku_gruppe dokugru ON tbtype.type_ID=dokugru.type_ID
LEFT JOIN tbl_ma_has_dokugru magruppe ON magruppe.dg_ID=dokugru.dg_ID
LEFT JOIN tbl_ma ma ON magruppe.ma_ID=ma.ma_ID
WHERE
DATE_FORMAT(dokugru.doku_date, '%m') = MONTH(NOW())
GROUP BY
tbtype.typ_kurz,
DATE_FORMAT(dokugru.doku_date, '%d.%m.%Y')
 
Zuletzt bearbeitet:
Zurück