MySQL LEFT JOIN
Ines
- datenbank
Hallo,
ich stehe hier gerade auf dem Schlauch. Ich habe drei Tabellen und möchte alle Datensätze aus persons ausgeben, zusätzlich die Anzahl an Einträgen in adresses für jede person (kann auch 0 sein) sowie den Namen des Landes aus dem ISO Ländercode aus persons (1:1 Beziehung).
Ich bekomme es einfach nicht hin alle persons zurück zu bekommen. Vielleicht kann jemand nettes mal ein Auge drauf werfen und mir einen Tipp geben.
Vielleicht verstehe ich das mit den joins auch nicht richtig??
SELECT persons.*, countries.name AS country_name, COUNT(adress.adress_id) AS person_adresses
FROM persons
LEFT OUTER JOIN adress ON (customers.person_id = adress.person_id)
LEFT OUTER JOIN countries ON (customers.country = countries.ISO)
GROUP BY projects.person_id
ORDER BY persons.person_id DESC
Danke im Voraus!
Ines aus dem verschneiten Nord-Westen ;-)
Hi!
Ich habe drei Tabellen und möchte alle Datensätze aus persons ausgeben, zusätzlich die Anzahl an Einträgen in adresses für jede person (kann auch 0 sein) sowie den Namen des Landes aus dem ISO Ländercode aus persons (1:1 Beziehung).
Hast du es schon mit korrelierten Unterabfragen (Subquerys) probiert anstatt mit Joins?
Ich bekomme es einfach nicht hin alle persons zurück zu bekommen.
Vielleicht verstehe ich das mit den joins auch nicht richtig??
Tabellennamen in Joinbedingungen und anderen Klauseln können sich nur auf beteiligte Tabellen beziehen, also solche die in der FROM-Klausel enthalten sind.
SELECT persons.*, countries.name AS country_name, COUNT(adress.adress_id) AS person_adresses
FROM persons
LEFT OUTER JOIN adress ON (customers.person_id = adress.person_id)
LEFT OUTER JOIN countries ON (customers.country = countries.ISO)
GROUP BY projects.person_id
ORDER BY persons.person_id DESC
customers und projects kommt nicht als eine der eingebundenen Tabelle vor. Das müsste eine Fehlermeldung ergeben.
Wenn du sinnvolle Hilfe haben möchtest, solltest du auch ein sinnvolles und kein fehlerhaft zusammengekürztes Beispiel bringen.
Lo!
SELECT persons.*, countries.name AS country_name, COUNT(adress.adress_id) AS person_adresses
FROM persons
LEFT OUTER JOIN adress ON (customers.person_id = adress.person_id)
LEFT OUTER JOIN countries ON (customers.country = countries.ISO)
GROUP BY adress.person_id
ORDER BY persons.person_id DESC
falls es jemanden interessiert, der Fehler lag im GROUP BY Statement,
funktionieren tut, der Grund liegt darin dass die Spalte person.person\_id gar nicht in der Ergebnis Tabelle steht:
`GROUP BY persons.person_id`{:.language-sql}
hab ich ganz alleine heraus gefunden, hätte mir ruhig mal jemand helfen können ;-)
Ines
moin,
hab ich ganz alleine heraus gefunden, hätte mir ruhig mal jemand helfen können ;-)
das problem wird unter anderem sein, dass du glaubst eine lösung gefunden zu haben und deswegen wohl hier nicht mehr rein schauen wirst. insofern könnte ich mir glatt die buchstaben sparen, aber es ist ja bald weihnachten....
erstens ist deine lösung mysql spezifisch, jedes andere dbms würde dir eine fehlermeldung um die ohren schmeisen und das zurecht. und wo wir schon bei mysql spezifisch sind, du kannst dir das ORDER BY sparen, ich meinte gelesen zu haben, das bei mysql bei einer gruppierung es auch sortiert nach der gruppierung ausgegeben wird.
des weiteren hat dir dedlfix schon den hinweis gegeben, dass es besser wäre, korrrelierte unterabfragen zum einsatz zu bringen. zu klären wäre noch, ob es überhaupt personen ohne country eintrag geben kann, dann sparst du dir noch einen OUTER JOIN......
Ilja