2012-12-30 34 views
2

我有兩個表,itemlog如何查找在其他表中找不到的行?

對於每個項目之間的1-1列關係,還有存儲項目是否已經被處理或不日誌。這由log.itemId等於item.id確定。 log.status指示處理過程是否正在進行或已完成(-1正在處理中,1正在處理中)。

在處理開始之前,log表中沒有關於item表中相應項目的表。

我試圖簡單地從項目中獲取行的日誌中沒有相應的行(意味着處理尚未開始)或狀態不是1(意味着它的未決)。

我快要瘋了試圖弄清楚這一點,這是我的查詢:

SELECT 
    item.id 
FROM item, log 
WHERE log.itemId != item.id 
OR (log.itemId = item.id AND log.status !='1') 
ORDER BY item.id ASC LIMIT 1 

然而,這將返回一個空的結果。

我在做什麼錯?

+0

如果你想要所有的行,爲什麼要有'limit 1'? –

回答

4

試試這個:

SELECT 
    item.id 
FROM 
    item left join log on (log.itemId = item.id) 
WHERE 
    log.itemId is null 
    OR log.status !='1' 
ORDER BY item.id LIMIT 1 
1

一個決定是使用EXISTS(http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries。 html),您在下面找到的示例,或者您可以使用LEFT JOIN。

SELECT * 
FROM item AS i 
WHERE NOT EXISTS(
    SELECT * 
    FROM log AS l 
    WHERE l.itemId = i.id 
     AND l.status != 1 
) 
LIMIT 0, 1; 
+0

在子查詢中使用'l.itemId'和'limit 1'子句的索引,這應該是最有效的解決方案。 –

0

這裏是另一種方式來做到這一點:

SELECT item.id FROM item WHERE item.id NOT IN (SELECT itemid FROM log where log.status != '1') 
+0

這不值得讚賞,因爲它沒有正確回答問題。 –

+0

您錯過了狀態邏輯,答案是錯誤的。 – sorencito

2

而對方的回答提供的作品,是很常見的(外連接和外部表NULL檢查),另外還有一個在SQL方法更直接適用:

SELECT 
item.id 
FROM item 
WHERE 
not exists 
    (SELECT itemID from log where log.itemID = item.id and log.status = '1') 

我會建議您嘗試兩種,並確定其運行速度更快 - 外連接檢查空主場迎戰「不存在」語法。大多數數據庫不會優化兩個相同的查詢(即使結果相同),所以其中一個可能會優於另一個,儘管並不總是明顯哪個更好。

請注意,我在最後一行更改了!= to =,但我認爲這是正確的,但我可能誤解了邏輯。

相關問題