获取与我的需求不匹配的MySQL行的字段会导致执行几乎永远运行

问题描述

我有三个表:

我的目标是获取不属于任何feature_value的所有product我有一个想法,就是使用LEFT JOIN,以便获得所有可能的组合,然后过滤出下表中的字段没有值的行:feature_product和{{ 1}}(换句话说:我想获得与任何产品都不相关或与至少一个产品相关联的商品,但其中某些商品不存在)。

因此,我创建了以下请求,但该请求将永远运行,并且我不明白为什么:

product

您能告诉我为什么它不起作用吗?

解决方法

WHERE子句中的条件移动到适当的表联接的ON子句中:

SELECT fv.id_feature_value
FROM feature_value fv
LEFT JOIN feature_product fp
    ON fp.id_feature = fv.id_feature AND fp.id_feature IS NULL
LEFT JOIN product p
    ON p.id_product = fp.id_product AND p.id_product IS NULL
WHERE
    fv.custom = 1;

这里的问题是,WHERE子句中对除联接中第一个调用的第一个表以外的任何表的限制可能会过早地从结果集中过滤掉记录。

,

我会使用not exists

select fv.*
from feature_value fv
where not exists (
    select 1 
    from product p
    inner join feature_product fp on fp.id_product = p.id_product
    where fp.id_feature = fv.id_feature
)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...