【问题标题】:MySql scoping problem with correlated subqueries相关子查询的 MySql 范围问题
【发布时间】:2010-03-12 20:26:58
【问题描述】:

我有这个 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 部分时,这不起作用吗?我没有读到任何关于它的内容。

有人知道吗?我该怎么办?我花了很长时间来构建这个查询......我知道这是一个怪物查询,但它在一个查询中得到了我想要的,而且我已经很接近让它工作了!

谁能帮忙?

【问题讨论】:

    标签: sql mysql scope correlated-subquery


    【解决方案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 = ?
    

    【讨论】:

    • 有效!非常感谢!我不知道你只能关联一个深度。
    【解决方案2】:

    错误的原因是在子查询中m没有定义。它稍后在外部查询中定义。

    【讨论】:

      猜你喜欢
      • 2012-04-13
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      相关资源
      最近更新 更多