首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当子查询在条件下使用父查询的值时,它会产生“未知列”错误。

当子查询在条件下使用父查询的值时,它会产生“未知列”错误。
EN

Stack Overflow用户
提问于 2014-02-26 00:59:06
回答 1查看 122关注 0票数 0

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

代码语言:javascript
复制
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中:

代码语言:javascript
复制
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值吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-26 02:31:40

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

代码语言:javascript
复制
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连接在一起,创建一个临时表,并在临时表和升级中使用条件进行搜索。

代码语言:javascript
复制
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一无所知。基本上,你的第二个例子就是做同样的事情。如果你想成功,你也应该加入promotions

如下所示:

代码语言:javascript
复制
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”表示“所有费率都与此促销相关”,也许您可以使用以下查询:

代码语言:javascript
复制
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

由于我没有任何数据,所以我没有测试这段代码。如果我错了,请告诉我,谢谢。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22029544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档