当子查询返回单个NULL结果行时,NOT IN条件会得到意外结果。
有两张桌子,品牌和媒体。目标是只得到一个结果,其中包括没有与之相关联的给定媒体类型的媒体的品牌。
SELECT *
FROM brands
WHERE id NOT IN (
SELECT DISTINCT brand AS 'id'
FROM media
WHERE media_type=7
)
如果存在与品牌相关联的media_type=7条目,那么子查询将返回至少一个有效id的列表,那么查询将按预期工作。
但是,如果没有media_type=7的条目与任何品牌相关联,则子查询返回具有NULL值的单行。然后,total查询返回一个空集,而不是预期的:一个包含所有brands行的结果。
我在这里犯了什么错误?
使用10.4.26-MariaDB和表格是InnoDB类型
尝试以下相关的存在查询
select *
from brands b
where not exists (
select * from media m
where m.media_type = 7 and m.brand = b.Id
);
如果没有更多详细信息,很难知道错误,但另一个解决方案可能是执行LEFT JOIN,然后排除连接的行。。。
SELECT
b.*
FROM
brands b
LEFT JOIN
media m
ON m.brand = b.id
AND m.media_type = 7
WHERE
m.id IS NULL
即。您选择了联接失败的所有记录。。。因为这些记录具有匹配的id和media_type 7