2010-05-07 162 views
1

我有兩個表格:
1. tableA是包含許多列的記錄列表。有一個名爲「創建」的時間戳列
2. tableB用於跟蹤我的應用程序中已鎖定tableA中的記錄以供審閱的用戶。它由四列組成:id,user_id,record_id和另一個時間戳列表。我試圖從tableA中選擇最多10個記錄,還沒有被tableB中的任何人鎖定以供審查(我還在WHERE子句中通過來自tableA的一些其他列(如記錄狀態)進行篩選)。以下是我到目前爲止所得到的結果:爲什麼SELECT ... JOIN語句不返回結果?

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' 

第一條語句驗證了這一點,而第二個返回了2000行。

回答

0

作任何上述記錄的時間戳之間按照你的另外兩個原則,如被新的,但不是「someproject」?

此外,您使用NULL你需要使用的任何時間,是或不是,而不是= /!=。

我不記得,如果MySQL的結構上的限制的想法不同,但如果tableB.id是你的主鍵,比它不能爲空。

最後,如果沒有在表B中的任何記錄,是否應該如何尋找不存在的記錄?它將始終返回零,因爲tableB和tableA中沒有任何匹配的記錄,因爲tableB爲空。

嘗試輸入TableB中的僞記錄符合搜索條件,看看輸出的變化。

0

已經回答了,但這裏是一些一般故障排除建議:不要試圖一下子解決這麼多的問題。我的第一種方法是消除條件和嘗試的所有過濾。如果我得到數據,然後將其中一半添加回來。如果有效,請嘗試另一半。重複,直到問題在你面前凝視。 通過這種方式進行故障排除,您已經快速將其縮小到「tableB.id = NULL」語句,並且可能會有D'OH!時刻,並找出答案。