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

Posted

技术标签:

【中文标题】MySQL选择其他表中没有匹配列的行【英文标题】:MySQL select rows that do not have matching column in other table 【发布时间】:2012-06-13 16:32:00 【问题描述】:

到目前为止,我似乎无法弄清楚这一点。我正在尝试连接两个表,并且只选择表 A 中在表 B 中没有匹配列的行。例如,假设我们有一个 users 表和一个 sent 表。

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

我想从users 中选择所有行,其中usernamesent 表中不存在。因此,如果tomuserssent 中,他将不会被选中。如果他在users 但不在sent,他将被选中。我试过了,但它根本不起作用:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

试试这个 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【参考方案3】:

也许这个可以帮助你....

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

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

希望这个能解决你的问题

【讨论】:

以上是关于MySQL选择其他表中没有匹配列的行的主要内容,如果未能解决你的问题,请参考以下文章

s-s-rS - 用于计算当前日期匹配或(参数选择日期)与其他一些等效列的行的表达式

匹配来自不同表的行 - MySQL

MySQL-表连接

MySQL 高级查询

MySQL内连接(INNER JOIN)

mysql join