mySQL值不在数据和数据中-嗯?
使用MySQL。 试图理解一个查找其他查询结果中没有的值的查询。似乎我应该返回一个74的值,对于一个不在其他查询结果中的值,但是我返回了0行 表名=phpbb3x_论坛。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
表中的一行具有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)