Sven Rautenberg: MYSQL JOINs treiben mich in den wahnsinn ...

Beitrag lesen

Moin!

hier mal eine vereinfachte form:

tabelle1: mitarbeiter (id, vorname, name, gruppen_id, aktiv)
tabelle2: gruppenzugehörigkeit (id, gruppen_id, mitarbeiter_id)
tabelle3: gruppen (id, name, aktiv)

Das hat mit deinem Problem jetzt zwar gar nichts zu tun, aber eine der Grundsatzregeln, die ich für mich mal aufgestellt habe: Gleiches heißt überall gleich.

Und für MySQL heißt das: Die ID-Spalte, die den primären Index darstellt, heißt überall gleich. Da sie in Fremdtabellen gerne als "tabellenname_id" benannt wird, um zu signalisieren, woher diese ID stammt, heißt sie in der Tabelle, wo sie herkommt, eben auch "tabellenname_id", und nicht nur "id".

Vorteile:

  • In Querys, bei denen man mehr als eine Tabelle involviert und Id-Spalten benötigt, spart man sich das Vergeben von Alias-Namen, denn die Id-Spalten heißen schon individuell, und nicht alle identisch "Id".

  • Egal wo so eine Id-Spalte auftritt: Wenn irgendwo anders derselbe Name auch auftritt, ist klar, dass diese beiden Spalten dieselbe Id enthalten. Einträge derselben Id gehören zusammen.

  • In Joins kann man es sich sehr leicht machen, indem man "FROM tabellea JOIN tabelleb USING (mitarbeiter_id)" schreibt, und schon ist die Identität der Id im Join gewährleistet. Sowas funktioniert nur bei identischen Spaltennamen in beiden Tabellen, aber es bietet sich für 1:n-Beziehungen geradezu an.

Und da kommen wir dann doch langsam zu deinem Join: Warum joinst du nicht explizit? Warum wirfst du erstmal alle drei Tabellen hinter FROM auf einen großen Haufen und sortierst dann die dir genehmen Join-Bedingungen und Selektionskriterien in einem riesigen WHERE?

Trenne diese beiden Dinge. Im expliziten JOIN formulierst du, welche Zeilen der Tabellen zueinander gehören. Im unabhängig davon formulierten WHERE steht, welche der aus dem JOIN resultierenden Ergebniszeilen du als Resultat wünschst.

Vorteil: Das WHERE kann man dann einfach komplett weglassen, um zu erfahren, aus welcher Ergebnismenge man eigentlich selektiert. Das geht bei deinem Mischmasch-WHERE-JOIN nicht.

Also räume erstmal deinen Query auf, das erleichtert dir die Fehlersuche - und die beginnt schon mal ganz zu Anfang: Was ist das Ergebnis des JOINs der ersten beiden Tabellen? Was ist dann das Ergebnis mit der dritten Tabelle? Und welche Spalten enthalten dann die entscheidende Information?

- Sven Rautenberg