如果我执行以下查询,它可以正常工作:
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我得到了错误Unknown column 'promotions.id' in 'on clause'。在这两种情况下,我都在子查询中使用promotions.id,但它在WHERE中工作,但在ON中不起作用。为什么它要与一个而不是对另一个起作用?
还有另一种方法可以进行第二个查询来计数NULL值吗?
发布于 2014-02-26 02:31:40
看看这个例子,也许更容易理解:
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连接在一起,创建一个临时表,并在临时表和升级中使用条件进行搜索。
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一无所知。基本上,你的第二个例子就是做同样的事情。如果你想成功,你也应该加入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由于我没有任何数据,所以我没有测试这段代码。如果我错了,请告诉我,谢谢。
https://stackoverflow.com/questions/22029544
复制相似问题