2012-10-15 58 views
0

以下命令使用正確的orderRef選擇'商品'中出現的'商品'中的所有商品。從表格a中選擇何時不在表格中b

SELECT a.* FROM stock a LEFT JOIN items b ON a.id = b.stockId WHERE b.orderRef='orderRef'

這工作,但我需要未在表「項目」用正確的orderRef列出的所有項目。

我以爲我應該改變'開'到它的對面,但'關'不起作用。

+1

如果它的項目中沒有匹配的行,它如何具有正確的'orderRef'? – Erik

+0

我使用st-> bindValue – LewiG

+0

yes來添加orderRef,但是'orderRef'在表b中...並且您希望表a中沒有表b中的條目的行... – Erik

回答

1

的最好辦法做一個「不」查詢MySQL是以下幾點:

select s.* 
from stock s 
where not exists (select 1 from items i where s.id = i.stockID and i.orderref = 'orderref' limit 1) 

MySQL的優化工作方式,在not exists表現最好。這可以通過對items.stockID進行索引來進一步增強。

請注意,當您使用左外部聯接時,如果第二個表中存在重複項,您可能會無意中將行的數目相乘。

+0

偉大的工程,謝謝你 – LewiG

0

試試這個:

SELECT a.* FROM stock a LEFT JOIN items b ON a.id = b.stockId WHERE 
       b.stockId is null and a.orderRef='orderRef' 
+0

根本不返回任何行 – LewiG

+0

我已經用修復程序更新了我的答案,但爲了實現這個目標,您必須在股票表中有一個orderRef字段,這是否正確? – Nelson

+0

不,從庫存表項目填充項目表,這是由股票編號分離 – LewiG

相關問題