如果我执行以下查询,它工作正常:
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 将 rates
和 promotions_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 尝试将 rates
和 promotions_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/