8

私はこの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

これは正しく機能しますが、必要なIDをクエリにハードコーディングした場合に限ります(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

そして、私はエラーを受け取ります:

'where句'の不明な列'm.id'

なんで?MySqlマニュアルから:

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

それで...サブクエリがSELECTセクションにある場合、これは機能しませんか?私はそれについて何も読んでいませんでした。

誰か知っている?私は何をすべきか?このクエリを作成するのに長い時間がかかりました...これはモンスタークエリであることはわかっていますが、1つのクエリで必要なものを取得でき、動作するようになりました。

誰か助けてもらえますか?

4

2 に答える 2

9

相関させることができるのは1レベルだけです。

使用する:

   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 = ?
于 2010-03-12T20:36:15.803 に答える
1

エラーの理由は、サブクエリmで定義されていないためです。これは、後で外部クエリで定義されます。

于 2010-03-12T20:36:21.777 に答える