Tach!
nun funktioniert das mit dem
LEFT JOIN
nicht so wie ich erwartet hätte.
Meine Mepfehlung: Leg erstmal alle Erwartungen an Joins beiseite und schau dir an, wie Joins generell funktionieren.
Das ein Array an Daten aus der Haupttabelle erstellt wird und dann für jede "gejointe" Tabelle, wenn denn nicht
NULL
zurück kommt, ein Array innerhalb des Arrays erzeugt wird in welches die Daten der "gejointen" Tabelle geschrieben werden.
Arrays spielen für das DBMS keine Rolle. Bleib erstmal im DBMS. Die Ergebnismenge einer Query sieht immer tabellenförmig, also Zeilen mit Werten, und keinesfalls wie eine Baumstruktur. (Das Wort Menge kommt übrigens nicht nur zufällig so oft vor. So ein DBMS arbeitet mengenorientiert.)
Bei einem Join entsteht eine Datenmenge mit X mal Y Datensätzen. Jeder Datensatz der Tabelle X wird mit jedem Datensatz der Tabelle Y verknüpft. Das nennt sich kartesisches Produkt (von Descaretes, nicht von Karthago). Diese Menge wird durch die Art des Joins eingeschränkt, sowie durch Joinbedingungen und generelle Datensatzausschlussbedingungen (WHERE und HAVING).
Wenn du diese flache Datenstruktur lieber als Baum oder verschachtelte Arrays hättest, musst du sie nach dem Abfragen selbst in eine solche Form bringen. Wenn die Datensätze nach X sortiert sind, kannst du mit der Gruppenwechseltechnik arbeiten. Wenn die X-Werte gleich bleiben, bist du immer noch im selben X-Datensatz, wenn sie sich ändern, hast du eine neue Gruppe. Wenn X unsortiert ist, kannst und musst du für jeden Datensatz der Ergebnismenge anhand der X-Werte die passende Stelle im Ziel-Array suchen.
Es kommt aber ein Array aus dem Query der die Reihe der zuletzt gejointen Tabelle beinhaltet, was logischerweise beim
fetch_assoc()
dazu führt, dass die Werte aus Tabelle 2 respektive 3, mit den Werten aus 4 bzw. 5 überschrieben werden.
Aliasnamen für uneindeutige Spaltennamen helfen.
Kann ich irgendwie schon im Query mein Array sortieren?
Dein Array nicht, aber die Ergebnismenge kann selbstverständlich sortiert werden: ORDER BY. Nur zusammenfassen kannst du die Datensätze nicht innerhalb des DBMS.
Vorher hatte ich es so, dass ich für die Haupttabelle eine Abfrage gestellt habe und dann über die Ergebnismenge iteriert habe und für jede Iteration eine Anfrage an die nächste Tabelle gestellt habe um das Ergebnis eben in ein Array zu schreiben wo die Daten dann geordnet waren.
Für kleine Datenmengen durchaus nicht unzweckmäßig. Je nach Situation kann das eine oder das andere für dich oder für das DBMS Mehraufwand bedeuten. Es ist eine Abwägungssache, was man dann letzlich nimmt.
Problem ist eben nur, das schon der Query ein "falsches" Ergebnis liefert.
Abgesehen von eindeutigen Ergebnismenge-Spaltennamen durch Aliase wirst du kein anderes Ergebnis aus einer Query bekommen.
dedlfix.