我有两张桌子:
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行。
答案 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.html和Why 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!那一刻并想通了。