Herbie: Problem mit MySQL Left Join

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

  1. 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).

  2. 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

    1. 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

  3. 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

    --
    "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
    1. 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