MySQL“变量”在这种情况下不可用

MySQL“变量”在这种情况下不可用,mysql,mysql-error-1054,Mysql,Mysql Error 1054,基本问题是——我试图在WHERE CASE语句中使用子查询的计数作为变量,但它似乎不允许我使用它。当我把SELECT COUNTid。。。语句在WHERE区域中,但是如果我这样做,我必须将它包含3-4次,而不是仅包含一次,如果我可以将它放入SELECT 下面是一个经过修改的示例查询,它解释了我的问题。这不是我正在使用的确切查询,但它给出的错误与我的更长/更复杂的查询相同: 错误: [Err]1054-where子句中的未知列“匹配的_节” 查询: 问题是,当MySQL开始解析您的查询时,SELE

基本问题是——我试图在WHERE CASE语句中使用子查询的计数作为变量,但它似乎不允许我使用它。当我把SELECT COUNTid。。。语句在WHERE区域中,但是如果我这样做,我必须将它包含3-4次,而不是仅包含一次,如果我可以将它放入SELECT

下面是一个经过修改的示例查询,它解释了我的问题。这不是我正在使用的确切查询,但它给出的错误与我的更长/更复杂的查询相同:

错误:

[Err]1054-where子句中的未知列“匹配的_节”

查询:


问题是,当MySQL开始解析您的查询时,SELECT子句是要分析的最后一位。因此,当它通过WHERE子句时,匹配的_部分还不存在,因为SELECT子句还没有被查看

快速看一看,你可以试试这样的东西,尽管我认为有人会想出一些更优雅的东西:

SELECT
    articles.id,
    matched_sections.count
FROM
    articles
LEFT JOIN
    articles_site_sections ON articles_site_sections.article_id = articles.id
LEFT JOIN
    site_areas_site_sections ON articles_site_sections.site_section_id = 
    site_areas_site_sections.site_section_id, 
(SELECT COUNT(id) as count FROM site_areas_site_sections WHERE
        site_areas_site_sections.site_area_id = 8) matched_sections
WHERE
    (CASE
        WHEN
            matched_sections.count > 0
        THEN
           site_sections.id = site_areas_site_sub_sections.site_sub_section_id
        END
)

由于SQL语句元素的处理顺序,在计算WHERE子句时未定义匹配的_部分

您可能希望将计数预填充到一个变量中,并在查询中使用该变量

DECLARE matched_sections INT;

SET matched_sections = (SELECT COUNT(id) 
                            FROM site_areas_site_sections 
                            WHERE site_areas_site_sections.site_area_id = 8);

正如已经告诉您的,错误与WHERE子句不知道您实际选择的值有关,因为它是在SELECT子句之前计算的

通常,可以通过将整个查询用作派生表来解决此问题,在这种情况下,外部查询可以使用匹配的_节别名:

SELECT
  id,
  matched_section
FROM (
  SELECT
      articles.id,
      (SELECT COUNT(id) FROM site_areas_site_sections WHERE
          site_areas_site_sections.site_area_id = 8) AS matched_sections
  FROM
      articles
  LEFT JOIN
      articles_site_sections ON articles_site_sections.article_id = articles.id
  LEFT JOIN
      site_areas_site_sections ON articles_site_sections.site_section_id = 
      site_areas_site_sections.site_section_id
) s
WHERE
  CASE
    WHEN matched_sections > 0
    THEN …
  END
如果原始条件包含对不打算检索的列的引用,则需要将它们添加到派生表的选择列表中,以便在外部查询的条件中使用它们


如果子查询与主查询不相关,并且不在您的示例中,则@Joe和@Dirk的解决方案可能比上述建议更好。

除了在计算where子句matched_section列时不存在之外,您的案例表达式似乎还有另一个问题。它引用了一个在FROM子句site_AREA_site_sub_部分中找不到的表。@Andriy M,上面的sql是一个修改过的示例查询,解释了我的问题,他可能只是忘记了输入/排除其他必要的位。
SELECT
  id,
  matched_section
FROM (
  SELECT
      articles.id,
      (SELECT COUNT(id) FROM site_areas_site_sections WHERE
          site_areas_site_sections.site_area_id = 8) AS matched_sections
  FROM
      articles
  LEFT JOIN
      articles_site_sections ON articles_site_sections.article_id = articles.id
  LEFT JOIN
      site_areas_site_sections ON articles_site_sections.site_section_id = 
      site_areas_site_sections.site_section_id
) s
WHERE
  CASE
    WHEN matched_sections > 0
    THEN …
  END