2010-03-12 51 views
5

Tôi đang gặp truy vấn Mysql này, Nó hoạt động:MySql Phạm vi vấn đề với truy vấn con tương quan

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  

Kết quả là:

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

Nó hoạt động correclty, nhưng chỉ khi tôi hardcode vào truy vấn id mà tôi muốn (37). Tôi muốn nó làm việc cho tất cả các mục trong bảng m3allem, vì vậy tôi cố gắng này:

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 

Và tôi nhận được một lỗi:

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

Tại sao? Từ hướng dẫn MySql:

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

... Vì vậy, làm điều này không làm việc khi subquery là trong một phần CHỌN? Tôi không đọc gì về điều đó.

Có ai biết không? Tôi nên làm gì? Nó đã cho tôi một thời gian dài để xây dựng truy vấn này ... Tôi biết đó là một truy vấn quái vật nhưng nó được những gì tôi muốn trong một truy vấn duy nhất, và tôi rất gần để làm cho nó hoạt động!

Có ai giúp được không?

Trả lời

6

Bạn chỉ có thể tương quan một cấp sâu.

Sử dụng:

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

Nó hoạt động! Cảm ơn rất nhiều! Tôi không biết rằng bạn chỉ có thể tương quan một cấp độ sâu. – Rolf

1

Lý do cho sự lỗi là trong subquery m không được định nghĩa. Nó được định nghĩa sau trong truy vấn bên ngoài.

Các vấn đề liên quan