当前位置: 首页 > 面试题库 >

相关子查询的MySQL范围界定问题

颜华池
2023-03-14
问题内容

我有这个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部分​​中时,这不起作用吗?我什么都没读。

有人知道吗?我该怎么办?我花了很长时间来构建此查询…我知道这是一个庞然大物查询,但它在单个查询中就可以满足我的要求,而且我已经接近使它起作用!

有人可以帮忙吗?


问题答案:

您只能关联一个级别的深度。

采用:

   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 = ?


 类似资料:
  • MySQL 提供了  BETWEEN AND 关键字,用来判断字段的数值是否在指定范围内。 BETWEEN AND 需要两个参数,即范围的起始值和终止值。如果字段值在指定的范围内,则这些记录被返回。如果不在指定范围内,则不会被返回。 使用 BETWEEN AND 的基本语法格式如下: [NOT] BETWEEN 取值1 AND 取值2 其中: NOT:可选参数,表示指定范围之外的值。如果字段值不满

  • 问题内容: 我很好奇为何应该比更快地执行。 当比尔·卡尔文提出一个要点时,我正在回答一个问题。当您使用它时,它使用相关子查询(依赖子查询),而IN()仅使用子查询。 解释显示,并且两者都使用了一个依赖子查询,并且都只使用了一个子查询..所以我很好奇关联子查询如何比子查询更快? 我以前使用过EXISTS,它的执行速度比IN快,这就是我感到困惑的原因。 这是带有说明的SQLFIDDLE 一些问题 在上

  • 问题内容: 我有一个Google Spreadsheet,我想运行一个函数。但是我希望该语句检查一系列值。我基本上是在寻找要在SQL中使用的语句-Google Spreadsheets中的等效语句是什么?所以现在我有: 那行得通。但是我真正需要的是: 当然,该声明会失败。如何获得一系列值的位置?这些是文本值,如果有区别的话。 问题答案: 大招Zolley!这是一个小改进。 代替: = CONCAT

  • 可以对模型的查询和写入操作进行封装,例如: <?php namespace app\index\model; use think\Model; class User extends Model { public function scopeThinkphp($query) { $query->where('name','thinkphp')->field('i

  • 我有这个问题。我希望它从内容表中选择4个条目,并按如下方式对条目进行排序: > 选择最近的条目。它表示按日期排序(mysql datetime)DESC,id DESC。 从这4个选定项中,按likes(mysql INT)DESC排序 运行查询时,它返回错误的结果。它选择与此条件匹配的条目,其中主题='id'和活动='1'。它按likes DESC对条目进行排序,但忽略了这个条件,即按日期DES

  • 我对mongodb有意见。有人能解释一下为什么这样做(给出了一些结果): 这不起作用(返回零): 非常感谢。