2012-06-10 80 views
24

到目前爲止,我似乎無法弄清楚這一點。我試圖連接兩個表,只選擇表A中沒有表B中匹配列的行。例如,假設我們有一個用戶表和一個發送表。MySQL選擇在其他表中沒有匹配列的行

users表有以下幾列:id, username
sent表有以下幾列:id, username

我想從users選擇所有行usernamesent表中。所以,如果tomuserssent他不會被選中。如果他在users但不在sent他將被選中。我試過,但它並沒有在所有的工作:

SELECT pooltest.name,senttest.sentname 
FROM pooltest,senttest 
WHERE pooltest.name != senttest.sentname 

回答

12

試試這個SQL:

SELECT users.username 
FROM users 
LEFT JOIN sent ON sent.username = users.username 
WHERE sent.username IS NULL; 

在我看來最好的辦法是:

SELECT users.username 
FROM users 
LEFT JOIN sent ON sent.id = users.id 
WHERE sent.id IS NULL; 

由於兩個ID字段,將被索引(主鍵我還以爲),所以這個查詢會比我建議的第一個更好地優化。

但是,您可能會發現我的第一個建議更適合您,這取決於您的應用程序的要求。

+0

通過一些其他幫助我也發現這個工作:SELECT * FROM pooltest LEFT JOIN senttest ON pooltest.name = senttest.sentname WHERE senttest.sentname IS NULL – xendi

53

通常情況下,你可以使用NOT EXISTS對於這種類型的查詢

SELECT p.Name 
FROM pooltest p 
WHERE NOT EXISTS (SELECT s.Name 
        FROM senttest s 
        WHERE s.Name = p.Name) 

的另一種方法是使用LEFT OUTER JOIN和檢查NULL

SELECT p.Name 
FROM pooltest p 
     LEFT OUTER JOIN senttest s ON s.Name = p.Name 
WHERE s.Name IS NULL 

請注意,您正在使用的隱式連接語法已被視爲已過時,應替換爲顯式連接。

-3

可能是這樣一個可以幫助你....

我也有同樣的問題,但使用該此查詢

INSERT INTO tbl1 (id,name) SELECT id,name from tbl2 where (name) not in(select name from tbl1); 

希望解決了這個人會解決你的問題

相關問題