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