Problem mit MySQL Left Join
Herbie
- datenbank
0 King^Lully0 Herbie0 Ilja
0 Leeloo5E
Hallo,
vielleicht hat jemand eine Idee zur Lösung meines Problem. Bei meiner MySQL-Abfrage (siche unten) bekomme ich immer folgende Meldung:
#1054 - Unknown column 'pg.uid' in 'on clause'
Aber die Spalte uid existiert definitv in der Tabelle product_grp. In normalen Abfragen gibt esauch keine Probleme. Die treten erst auf wenn ich mit Left Join arbeite.
Vielleicht habe ich auch irgendeinen Sytaxfehler drin und ich bin nur zu blind ihn zu sehen.
SELECT pg.uid AS guid, pg.parent_id AS gparent_id, pg.sort_id, pg.creation_date, ne.uid, ne.parent_id, n.content AS name
FROM product_grp AS pg, product_grp_name AS pgn, name AS n
LEFT JOIN be_nav_element AS ne ON (ne.foreign_id = pg.uid AND ne.type_id = '5')
WHERE pgn.grp_id = pg.uid
AND n.uid = pgn.name_id
AND n.lang_id = '1'
Ach ja, ich nutze MySQL 5.0.
Gruß
Herbie
FROM product_grp AS pg, product_grp_name AS pgn, name AS n
Nur mal so am Rande: Du bildest hier Produkte, das könnte Pech bringen. Besser ordentliche JOINs verwenden (typischerweise mit einer JOIN-Bedingung).
Problem gelöst. Ich habe noch ein wenig herumprobiert und folgendes festgestellt:
Wenn ich in der Zeile
FROM product_grp AS pg, product_grp_name AS pgn, name AS n
das product_grp AS pg nach hinten stellen also
FROM product_grp_name AS pgn, name AS n, product_grp AS pg
schreibe dann funktioniert es. Hat da vielleicht jemand eine Erklärung für?
Gruß
Daniel
yo,
Hat da vielleicht jemand eine Erklärung für?
ich kenne das gleiche problem bei oracle. bei der impliziten schreibweise der inner joins (tabellennamen durch kommas getrennt) werden die tabellen von rechts nach links abgearbeitet, sprich genau anders herum, als man es vermuten könnte (quasi dbms auch arabisch). und ganz offensichtlich probiert er somit den left join mit der ersten tabelle ganz recht zu joinen und schmeisst die fehlermeldung, wenn dort nicht die richtige tabelle für den left join steht.
deshalb und der besseren lesbarkeit wegen grundsätzlich immer die explizite inner join schreibweise verwenden.
Ilja
Hallo,
Hallo,
vielleicht hat jemand eine Idee zur Lösung meines Problem. Bei meiner MySQL-Abfrage (siche unten) bekomme ich immer folgende Meldung:
#1054 - Unknown column 'pg.uid' in 'on clause'
> SELECT pg.uid AS guid, pg.parent_id AS gparent_id, pg.sort_id, pg.creation_date, ne.uid, ne.parent_id, n.content AS name
> FROM product_grp AS pg, product_grp_name AS pgn, name AS n
> LEFT JOIN be_nav_element AS ne ON (ne.foreign_id = pg.uid AND ne.type_id = '5')
> WHERE pgn.grp_id = pg.uid
> AND n.uid = pgn.name_id
> AND n.lang_id = '1'
>
Hm ... du sagst pg.uid AS guid und versuchst dann doch die Original-Bezeichnung mit ne.foreign_id zu vergleichen. Letzteres kommt in deinem SELECT sonst überhaupt nicht vor. Merkwürdig.
Mein Vorschlag:
SELECT ..., ne.foreign_id FROM ...
... ON ne.foreign_id = guid ...
Gruß,
Leeloo
Hallo Leeloo5E,
SELECT pg.uid AS guid, pg.parent_id AS gparent_id, pg.sort_id, pg.creation_date, ne.uid, ne.parent_id, n.content AS name
FROM product_grp AS pg, product_grp_name AS pgn, name AS n
LEFT JOIN be_nav_element AS ne ON (ne.foreign_id = pg.uid AND ne.type_id = '5')
WHERE pgn.grp_id = pg.uid
AND n.uid = pgn.name_id
AND n.lang_id = '1'
>
> Hm ... du sagst pg.uid AS guid und versuchst dann doch die Original-Bezeichnung mit ne.foreign\_id zu vergleichen. Letzteres kommt in deinem SELECT sonst überhaupt nicht vor. Merkwürdig.
Nein, nicht merkwürdig - sondern richtig.
Spaltenaliasnamen dürfen bei MySQL zwar in der WHERE-Klausel vorkommen,
jedoch nicht in der JOIN-Klausel, wie ich [erst vor kurzem](https://forum.selfhtml.org/?t=152455&m=991602) anmerkte.
Völlig überflüssig ist jedoch, dass Spalten, die in der Join-Klausel verwendet
werden, auch in der Spaltenliste erscheinen müssen.
Wie der King bereits zu Recht anmerkte, ist die Mischung zwischen expliziter
und impliziter JOIN-Syntax schon recht merkwürdig.
Freundliche Grüße
Vinzenz