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

到目前为止,我似乎无法弄清楚这一点。我正在尝试连接两个表,并且只选择表 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

【问题讨论】:

    标签: mysql join duplicates unique


    【解决方案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);
      

      希望这个能解决你的问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-09
        相关资源
        最近更新 更多