mySQL值不在数据和数据中-嗯?

mySQL值不在数据和数据中-嗯?,mysql,Mysql,使用MySQL。 试图理解一个查找其他查询结果中没有的值的查询。似乎我应该返回一个74的值,对于一个不在其他查询结果中的值,但是我返回了0行 表名=phpbb3x_论坛。 表中的一行具有forum_id=74。 可在此处查看的表:您还可以在该链接上运行这些查询 论坛id 74不在以下3个查询的结果中: select l0.forum_id FROM step2_02_for.phpbb3x_forums l0 left join phpbb3x_forums l1 on l0.forum_id

使用MySQL。 试图理解一个查找其他查询结果中没有的值的查询。似乎我应该返回一个74的值,对于一个不在其他查询结果中的值,但是我返回了0行

表名=phpbb3x_论坛。
表中的一行具有forum_id=74。 可在此处查看的表:您还可以在该链接上运行这些查询

论坛id 74不在以下3个查询的结果中:

select l0.forum_id
FROM step2_02_for.phpbb3x_forums l0
left join  phpbb3x_forums l1 on l0.forum_id = l1.parent_id
left join  phpbb3x_forums l2 on l1.forum_id = l2.parent_id
left join  phpbb3x_forums l3 on l2.forum_id = l3.parent_id
where l0.parent_id = 0

select l1.forum_id
FROM step2_02_for.phpbb3x_forums l0
left join  phpbb3x_forums l1 on l0.forum_id = l1.parent_id
left join  phpbb3x_forums l2 on l1.forum_id = l2.parent_id
left join  phpbb3x_forums l3 on l2.forum_id = l3.parent_id
where l0.parent_id = 0

select l2.forum_id
FROM step2_02_for.phpbb3x_forums l0
left join  phpbb3x_forums l1 on l0.forum_id = l1.parent_id
left join  phpbb3x_forums l2 on l1.forum_id = l2.parent_id
left join  phpbb3x_forums l3 on l2.forum_id = l3.parent_id

where l0.parent_id = 0
因此,我希望在运行以下命令时返回forum_id=74

select forum_id from step2_02_for.phpbb3x_forums 
where forum_id not in 

(select l0.forum_id
FROM step2_02_for.phpbb3x_forums l0
left join  step2_02_for.phpbb3x_forums l1 on l0.forum_id = l1.parent_id
left join  step2_02_for.phpbb3x_forums l2 on l1.forum_id = l2.parent_id
left join  step2_02_for.phpbb3x_forums l3 on l2.forum_id = l3.parent_id
where l0.parent_id = 0 )

and forum_id not in 
(select l1.forum_id
FROM step2_02_for.phpbb3x_forums l0
left join  step2_02_for.phpbb3x_forums l1 on l0.forum_id = l1.parent_id
left join  step2_02_for.phpbb3x_forums l2 on l1.forum_id = l2.parent_id
left join  step2_02_for.phpbb3x_forums l3 on l2.forum_id = l3.parent_id
where l0.parent_id = 0)


and forum_id not in 
(select l2.forum_id
FROM step2_02_for.phpbb3x_forums l0
left join  step2_02_for.phpbb3x_forums l1 on l0.forum_id = l1.parent_id
left join  step2_02_for.phpbb3x_forums l2 on l1.forum_id = l2.parent_id
left join  step2_02_for.phpbb3x_forums l3 on l2.forum_id = l3.parent_id
where l0.parent_id = 0)
相反,我没有得到任何返回的行

运行以下程序时,它会按预期工作:

select forum_id from step2_02_for.phpbb3x_forums 
where forum_id not in 

(select l0.forum_id
FROM step2_02_for.phpbb3x_forums l0
left join  step2_02_for.phpbb3x_forums l1 on l0.forum_id = l1.parent_id
left join  step2_02_for.phpbb3x_forums l2 on l1.forum_id = l2.parent_id
left join  step2_02_for.phpbb3x_forums l3 on l2.forum_id = l3.parent_id
where l0.parent_id = 0 )

and forum_id not in 
(select l1.forum_id
FROM step2_02_for.phpbb3x_forums l0
left join  step2_02_for.phpbb3x_forums l1 on l0.forum_id = l1.parent_id
left join  step2_02_for.phpbb3x_forums l2 on l1.forum_id = l2.parent_id
left join  step2_02_for.phpbb3x_forums l3 on l2.forum_id = l3.parent_id
where l0.parent_id = 0)
返回的值包括74和我期望的所有其他值


非常感谢您提供的任何帮助。

我想您面临的问题是
不在
中,子查询返回
NULL
值。最简单的修复方法是只在
中输入notnull
,以防止出现这种情况

考虑一个简单的条件
,其中col位于(A,B,C,NULL)
。如果
col
采用
A
B
C
,则查询返回true。否则返回unknown,将其视为false

现在,将条件更改为
不在
其中col不在(A、B、C、NULL)
。可能发生两件事。当
col
A
B
C
时,
不在
返回false。对于任何其他值,它返回unknown,该值被视为false。换句话说,如果列表中有一个
NULL
值,那么
notin
永远不会返回true

“真正的”解决方案是停止使用
不在
中,而是使用
不存在
。这就是转变。当你写作时:

 where y.col not in (select col2 from table x)
你真的是说:

 where not exists (select 1 from table x where x.col2 = y.col)