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, 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
【问题讨论】:
【参考方案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选择其他表中没有匹配列的行的主要内容,如果未能解决你的问题,请参考以下文章