问题描述
我有三个表:
我的目标是获取不属于任何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
)