2010-03-12 60 views
5

我有這個MySQL查詢,它的工作原理:與相關子查詢MySQL的範圍界定問題

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  

結果是:

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

它的工作原理correclty,但只有當我硬編碼到查詢我想要的身份證件(37)。 我希望它在m3allem表中的所有項目工作,所以我試試這個:

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 

我得到一個錯誤:

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

爲什麼? 從MySQL手冊:

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

那麼... ...當子查詢是在SELECT部分​​本不工作?我沒有讀到任何有關這方面的信息。

有誰知道嗎?我該怎麼辦?我花了很長時間來構建這個查詢......我知道這是一個怪物查詢,但它在單個查詢中得到我想要的結果,而且我非常接近它的工作原理!

任何人都可以幫忙嗎?

回答

6

您只能關聯一個深度級別。

用途:

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

它的工作原理! 非常感謝!我不知道你只能關聯一個深度。 – Rolf 2010-03-12 22:11:52

1

的原因錯誤是,在子查詢m沒有定義。它在稍後的外部查詢中定義。