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

40

我目前似乎无法解决这个问题。我正在尝试连接两张表,并只选择表 A 中那些在表 B 中没有匹配的行。例如,假设我们有一个名为 users 的表和一个名为 sent 的表。

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

我想从 users 中选择所有usernamesent 表中不存在的行。因此,如果 tomuserssent 中都存在,则不会被选择。如果他在 users 中但不在 sent 中,他将被选择。我尝试了下面的方法,但完全不起作用:

SELECT pooltest.name,senttest.sentname 
FROM pooltest,senttest 
WHERE pooltest.name != senttest.sentname
3个回答

65

通常情况下,您会使用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

请注意,您正在使用的隐式连接语法已经过时,应该将其替换为显式连接。


30

尝试使用以下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 字段都会被索引(我认为应该是主键),因此这个查询比我之前建议的第一个查询更好优化。

不过,你可能会发现我的第一个建议更适合你,这取决于你的应用程序要求是什么。


通过其他的帮助,我也发现这个可以工作:SELECT * FROM pooltest LEFT JOIN senttest ON pooltest.name = senttest.sentname WHERE senttest.sentname IS NULL。 - xendi

-3
也许这个能帮到你....
我之前也遇到了同样的问题,但是使用了这个查询语句解决了。
INSERT INTO tbl1 (id,name) SELECT id,name from tbl2 where (name) not in(select name from tbl1);

希望这个能解决你的问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接