MySQL选择其他表中没有匹配列的行

时间:2012-06-10 12:39:09

标签: mysql join duplicates unique

到目前为止我似乎无法弄明白这一点。我正在尝试连接两个表,只选择表A中没有表B中匹配列的行。例如,假设我们有一个用户表和一个已发送的表。

users表格包含以下列:id, username
sent表格包含以下列:id, username

我想从users中选择username表中不存在sent的所有行。因此,如果tom位于users且位于sent,则不会被选中。如果他在users但不在sent,他将被选中。我试过了,但它根本不起作用:

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

3 个答案:

答案 0 :(得分:57)

通常,您会将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

请注意,您使用的隐式连接语法被认为已过时,应使用显式连接替换。

答案 1 :(得分:18)

试试这个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字段都会被编入索引(我会想到主键)所以这个查询会比我建议的第一个更优化。

但是,您可能会发现我的第一个建议更适合您,这取决于您对申请的要求。

答案 2 :(得分:-3)

可能这个人可以帮助你......

我也有同样的问题,但解决了使用此查询

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

希望这个能解决你的问题