2009-06-17 98 views
1

我正在为一个共享主机环境中的一个网站做了一些工作,这个共享主机环境有一个翻转设置的历史记录。本周,更新脚本突然停止工作,其根本原因是用于返回结果的NOT IN子句不再执行此操作。MySQL“不在”查询突然停止返回结果

查询,在其本质,是这样的:

SELECT * 
FROM db1.entry 
where entry_id not in 
(
    select entry_id from db2.content 
) 

我可以确认,确实有应该由两个表直接检查返回的记录。当运行以下两个查询,第一个返回entry_ids第二不会:

SELECT * 
FROM db1.entry 
order by entry_id desc 

SELECT * 
FROM db2.content 
order by entry_id desc 

并再次重申,这是所有几个月正常工作。没有进行任何代码更改,但可能会改变MySQL设置。在PHP环境中更改某些内容也是可能的,但这似乎不太可能,因为从phpMyAdmin运行时,与从实时站点运行时相同,查询有问题。

而且,当然,它仍然可以在我的开发盒上完美工作。

生活网站运行MySQL版本4.1.11。我的问题是,有没有人知道该版本的MySQL设置会改变这些NOT IN查询的工作方式?

谢谢。

回答

5

确保你的内部查询不返回NULL's。

documentation

为了符合SQL标准,IN回报NULL不仅如果在左侧的表达式是NULL,而且如果不匹配,在列表中找到和的一个列表中的表达式是NULL

+0

我实际测试同时在子查询无效检查查询,并没有帮助。只有在我回复了你的评论之后,更新了我的问题以包含一个NOT NULL,并重新尝试了它实际上的工作。 看起来这是救援的“老板效应”。直到你展示给老板之前,没有什么能够打破。如果你在互联网上询问它们,破碎的东西会自行修复。 谢谢! – 2009-06-17 13:29:26

1

你可能有一个NULL值的至少一个行中entry_id 使用LEFT JOIN或NOT EXISTS代替