Sven Rautenberg: suche Hilfe bei DB-Abfrage - MySQL

Beitrag lesen

Moin!

Ich habe mich dann also mit den neuen Tabellen an die Abfrage gewagt.

Geht es dir wirklich nur um die IDs?

Dann kannst du dir sämtliche JOINs auf die Tabellen groups, pages und modules sparen, denn die IDs stehen auch in rel_groups_modules_pages alle drin.

Schlimmstenfalls brauchts noch ein JOIN auf rel_groups_user.

Und WENN, dann würde ich tatsächlich erstmal den primär die Daten sachlich verknüpfenden JOIN ganz an den Anfang bringen, nämlich rel_groups_modules_pages und rel_groups_user.

Noch ein guter JOIN-Rat: Ich mag die Prämisse "Gleiches muss gleich heißen", deshalb heißt bei mir in allen Tabellen die userID immer userID, auch in der Tabelle user.userID. Der Vorteil: Ich kann die JOIN-Bedingung mittels "USING (userID)" formulieren und muss nicht "user.ID = rel_groups_user.userID" schreiben.

Gleiches heißt gleich und ist verknüpft - das ist ein super Namensschema.

Und du sparst dir dann auch die dummen Alias-Bezeichner für alle diese Fälle, dass du aus mehr als einer Tabelle mal deren ID wissen willst, weil diese ID schon automatisch den Tabellennamen, aus dem sie ursprünglich kommt, in sich trägt.

  
SELECT  
    `groups`.groupID,  
    `pages`.pageID,  
    `modules`.moduleID  
FROM  
    `rel_groups_user`  
LEFT JOIN  
    `rel_groups_modules_pages` USING (groupID)  
  
LEFT JOIN  
    `groups` USING (groupID)  
LEFT JOIN  
    `modules` USING (moduleID)  
LEFT JOIN  
    `pages` USING (pageID)  
  
WHERE  
     userID = ?  
AND  
    pageID = ?

Wenn ich es richtig sehe, bekomme ich damit alle Daten die ich wollte. Ich müsste hinterher nur noch etwas sortieren.
Was haltet ihr davon? Ist die Abfrage ok oder geht es besser/schneller/unkomplizierter?

Mit USING wirds auf jeden Fall übersichtlicher, sowas geht aber nur bei namensgleichen Spalten in den beiden Tabellen.

Und alles andere, insbesondere Performance, sollte an dieser Stelle noch nicht bewertet werden. Logisch, dass du in der Tabellenstruktur mit passenden Indices arbeiten wirst, aber ich muss dir sagen, dass ich persönlich mir zum Erstellzeitpunkt der Tabelle über nützliche Index-Definition noch keine großen Gedanken mache, bzw. dieses Thema auf später verschiebe. Erst wenn tatsächlich ein paar Daten in der DB existieren und die abfragenden Querys sich nicht mehr groß ändern, kann man mal ein EXPLAIN laufen lassen, um dann die notwendigen Indices zu definieren. Sollte man aber natürlich auch nicht vergessen. :)

- Sven Rautenberg