mysql - 当子查询在 ON 条件下使用父查询的值时,会产生 'Unknown column' 错误

标签 mysql join subquery

如果我执行以下查询,它工作正常:

SELECT
CASE WHEN (SELECT COUNT(*)
    FROM rates r
    LEFT JOIN promotions_rates pr
        ON r.id = pr.rate_id
    WHERE pr.promo_id IS NULL
    AND pr.promo_id = promotions.id)
    > 0 THEN 'N' ELSE 'Y' END AS 'all_rates_selected'
FROM promotions

但是,如果我重新排列它以将 promotions.id 放在 ON 部分而不是 WHERE 中,如下所示:

SELECT
    CASE WHEN (SELECT COUNT(*)
        FROM rates r
        LEFT JOIN promotions_rates pr
            ON r.id = pr.rate_id
            AND pr.promo_id = promotions.id
        WHERE pr.promo_id IS NULL)
        > 0 THEN 'N' ELSE 'Y' END AS 'all_rates_selected'
FROM promotions

我收到错误“on Clause”中的未知列“promotions.id”。在这两种情况下,我都在子查询中使用 promotions.id,但它在 WHERE 中有效,但在 ON 中无效。为什么它适用于其中一种而不适用于另一种?

还有其他方法可以执行第二个查询来计算 NULL 值吗?

最佳答案

看一下这个例子,也许更容易理解:

SELECT *
FROM rates r 
LEFT JOIN promotions_rates pr ON r.id=pr.rate_id,
promotions p
WHERE pr.promo_id=p.id

这将会成功,因为连接条件不包括促销列。 Mysql 将 ratespromotions_rates 连接在一起,创建一个临时表,并在临时表和促销中使用 where 条件进行搜索。

SELECT *
FROM rates r 
LEFT JOIN promotions_rates pr ON r.id=pr.rate_id AND pr.promo_id=p.id,
promotions p
WHERE pr.promo_id IS NULL

这将失败,因为当 mysql 尝试将 ratespromotions_rates 连接在一起时,它不知道任何有关 promotions 的信息。基本上,您的第二个示例正在做同样的事情。如果您希望成功,您也应该加入促销事件

像这样:

SELECT *
FROM rates r 
LEFT JOIN promotions_rates pr ON r.id=pr.rate_id AND pr.promo_id=p.id
LEFT JOIN promotions p ON pr.promo_id=p.id
WHERE pr.promo_id IS NULL

我还没有运行第一个查询,但我认为这个查询将始终返回“Y”,因为在第一个查询中,您试图在promotions中搜索 id 为“null”的记录> 表。

如果您的“Y”代表“所有费率都与某些促销事件相关”,您可能需要删除 AND pr.promo_id = Promotions.id 部分。如果您的“Y”代表“所有费率都与此促销相关”,也许您可​​以使用以下查询:

SELECT CASE WHEN(p_count.count=r_count.count THEN 'Y' ELSE 'N' END AS all_rates_selected
FROM promotions
LEFT JOIN (
    SELECT count(*) as count,p.id as id
    FROM promotions p
    LEFT JOIN promotions_rates pr ON p.id = pr.promo_id
    LEFT JOIN rates r ON r.id=pr.rate_id
    GROUP BY p.id
) p_count ON promotions.id = p_count.id,
(
    SELECT count(*) as count
    FROM rates
) r_count

我没有测试过这段代码,因为我没有任何数据。如果我的理解有误,请告诉我,谢谢。

关于mysql - 当子查询在 ON 条件下使用父查询的值时,会产生 'Unknown column' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22029544/

相关文章:

sql - 可以使用 phpMyAdmin 将 Excel 文件导入 MySQL 数据库吗?

mysql - 为 MyDAC 定义自定义 POST 方法

MYSQL使用JOIN从一张表中提取两列

sql-server - 如何查找具有重复值的 MIN 并将 MIN 值替换为 varchar

MySQL:连接三个表,比较两个值

mysql - 从命令行备份 MySql 数据库

mysql - 如何为我的 MySql 表列之一生成唯一的随机字符串?

mysql - 如何使用自定义结果在mysql中加入同一个表

mysql - 使用以逗号分隔的 id sql

mysql - 多个查询合并为一个查询