2012-06-10 83 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); 

希望解决了这个人会解决你的问题

相关问题