2010-03-12 12 views
5

mam tej kwerendy MySQL Działa:MySql Problem scoping z skorelowanych podkwerend

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  

Wynikiem jest:

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

Działa correclty, ale tylko wtedy, gdy zakodować w zapytaniu id, którego chcę (37). chcę go do pracy dla wszystkich wpisów w tabeli m3allem, więc spróbuj tego:

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 

I pojawia się błąd:

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

Dlaczego? z podręcznika MySQL:

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

Więc ... Czy to nie działa, gdy podzapytanie jest w sekcji SELECT? Nic o tym nie czytałem.

Czy ktoś wie? Co powinienem zrobić? Zbudowanie tego zapytania zajęło mi dużo czasu ... Wiem, że jest to monster query, ale dostaje to, czego chcę w jednym zapytaniu, a ja jestem tak blisko, żeby to działało!

Czy ktoś może pomóc?

Odpowiedz

6

Można korelować tylko jeden poziom głębokości.

Zastosowanie:

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

Działa! Wielkie dzięki! Nie wiedziałem, że można skorelować tylko jeden poziom głębokości. – Rolf

1

Przyczyną tego błędu jest to, że w podzapytaniu m nie jest zdefiniowana. Zostało to zdefiniowane później w zapytaniu zewnętrznym.

Powiązane problemy