为什么这个SELECT ... JOIN语句没有返回结果?

时间:2010-05-07 17:48:41

标签: sql mysql select timestamp left-join

我有两张桌子:
  1. tableA是包含许多列的记录列表。有一个名为“created”的时间戳列   2. tableB用于跟踪我的应用程序中已锁定tableA中的记录以供审阅的用户。它由四列组成:id,user_id,record_id和另一个时间戳列。

我正在尝试从tableA中选择最多10条记录,这些记录尚未被tableB中的任何人锁定以供查看(我还在tableA中的一些其他列中过滤WHERE子句,如记录状态)。这是我到目前为止所提出的:

SELECT tableA.* FROM tableA
  LEFT OUTER JOIN tableB ON tableA.id = tableB.record_id WHERE
  tableB.id = NULL AND
  tableA.status = 'new' AND
  tableA.project != 'someproject' AND
  tableA.created BETWEEN '1999-01-01 00:00:00' AND '2010-05-06 23:59:59'
  ORDER BY tableA.created ASC LIMIT 0, 10;

tableA中目前有几千条记录,tableB中有零条记录。肯定有这些时间戳之间的记录,我用简单的

验证了这一点
SELECT * FROM tableA WHERE  
created BETWEEN '1999-01-01 00:00:00' AND '2010-05-06 23:59:59'  

上面的第一个语句返回零行,第二个语句返回超过2,000行。

3 个答案:

答案 0 :(得分:6)

tableB.id = NULL 

应该是

tableB.id IS NULL 

它永远不会是真的(也不是假的.NULL = NULL计算为未知因此tableB.id<> NULL同样不会返回任何结果。)

请参阅http://dev.mysql.com/doc/refman/5.0/en/working-with-null.htmlWhy does NULL = NULL evaluate to false in SQL server

答案 1 :(得分:0)

时间戳之间的任何记录是否遵循其他两个指导原则,例如是新的但不是“某个项目”?

此外,每次使用NULL时,都需要使用IS或IS NOT,而不是= /!=。

我不记得MySQL的结构是否与约束的想法不同,但如果tableB.id是你的主键,那么它不能是NULL。

最后,如果表B中没有任何记录,那么它应该如何搜索不存在的记录?它总是返回零,因为tableB和tableA中没有任何匹配的记录,因为tableB是空的。

尝试在TableB中输入与您的搜索条件匹配的虚拟记录,并查看输出是否发生变化。

答案 2 :(得分:0)

已经回答了,但这里有一些常见的故障排除建议:不要试图一次解决这么多问题。我的第一种方法是消除条件的所有过滤并尝试它。如果我获得数据,那么将其中一半添加回来。如果可行,请尝试另一半。重复,直到问题出现在你脸上。 通过这种方式进行故障排除,您可以快速将其缩小到“tableB.id = NULL”语句,并且可能会有D'OH!那一刻并想通了。

相关问题