2010-03-12 6 views
5

Ich habe diese Mysql-Abfrage, es funktioniert:MySql Scoping Problem mit korrelierten Unterabfragen

SELECT 
    nom 
    ,prenom 
    ,(SELECT GROUP_CONCAT(category_en) FROM 
      (SELECT DISTINCT category_en FROM categories c WHERE id IN 
       (SELECT DISTINCT category_id FROM m3allems_to_categories m2c WHERE m3allem_id = 37) 
      ) cS 
    ) categories 
    ,(SELECT GROUP_CONCAT(area_en) FROM 
      (SELECT DISTINCT area_en FROM areas c WHERE id IN 
       (SELECT DISTINCT area_id FROM m3allems_to_areas m2a WHERE m3allem_id = 37) 
      ) aSq 
    ) areas 
FROM m3allems m 
WHERE m.id = 37  

Das Ergebnis ist:

nom    prenom  categories    areas 
Man    Multi  Carpentry,Paint,Walls Beirut,Baalbak,Saida 

Es funktioniert Correclty, aber nur, wenn ich hart codieren in die Abfrage die ID, die ich will (37). Ich möchte es für alle Einträge in der Tabelle m3allem arbeiten, so dass ich versuchen Sie dies:

SELECT 
    nom 
    ,prenom 
    ,(SELECT GROUP_CONCAT(category_en) FROM 
      (SELECT DISTINCT category_en FROM categories c WHERE id IN 
       (SELECT DISTINCT category_id FROM m3allems_to_categories m2c WHERE m3allem_id = m.id) 
      ) cS 
    ) categories 
    ,(SELECT GROUP_CONCAT(area_en) FROM 
      (SELECT DISTINCT area_en FROM areas c WHERE id IN 
       (SELECT DISTINCT area_id FROM m3allems_to_areas m2a WHERE m3allem_id = m.id) 
      ) aSq 
    ) areas 
FROM m3allems m 

Und ich erhalte eine Fehlermeldung:

Unknown column 'm.id' in 'where clause'

Warum? Aus dem MySQL-Handbuch:

13.2.8.7. Correlated Subqueries 
[...] 
Scoping rule: MySQL evaluates from inside to outside. 

So ... funktioniert nicht, wenn die Unterabfrage in einer SELECT-Sektion ist? Ich habe darüber nichts gelesen.

Weiß jemand? Was soll ich machen? Ich habe lange gebraucht, um diese Abfrage zu erstellen ... Ich weiß, dass es eine Monsterabfrage ist, aber es bekommt, was ich will, in einer einzigen Abfrage, und ich bin so kurz davor, es zum Laufen zu bringen!

Kann jemand helfen?

Antwort

6

Sie können nur eine Ebene tief korrelieren.

Verwendung:

SELECT m.nom, 
      m.prenom, 
      x.categories, 
      y.areas 
    FROM m3allens m 
LEFT JOIN (SELECT m2c.m3allem_id, 
        GROUP_CONCAT(DISTINCT c.category_en) AS categories 
      FROM CATEGORIES c 
      JOIN m3allems_to_categories m2c ON m2c.category_id = c.id 
     GROUP BY m2c.m3allem_id) x ON x.m3allem_id = m.id 
LEFT JOIN (SELECT m2a.m3allem_id, 
        GROUP_CONCAT(DISTINCT a.area_en) AS areas 
      FROM AREAS a 
      JOIN m3allems_to_areas m2a ON m2a.area_id = a.id 
     GROUP BY m2a.m3allem_id) y ON y.m3allem_id = m.id 
    WHERE m.id = ? 
+0

Es funktioniert! Vielen Dank! Ich wusste nicht, dass man nur eine Ebene tief korrelieren kann. – Rolf

1

Der Grund für den Fehler ist, dass in der Unterabfrage m ist nicht definiert. Es wird später in der äußeren Abfrage definiert.

Verwandte Themen