【问题标题】:SELECT all contacts in table that do NOT have "X" [duplicate]选择表中没有“X”的所有联系人[重复]
【发布时间】:2018-04-14 09:33:27
【问题描述】:

我正在尝试在我的 MySQL 表中选择 CONTACTS,它在 INVESTMENTS 表中没有任何相关信息。

我有一个类似这样的查询,但它没有正确提取我的所有联系人。

TL;DR 选择所有联系人,然后删除所有有投资的联系人

SELECT
    *
FROM
    contacts
INNER JOIN investments ON investments.contactId = contacts.contactId
WHERE
    contacts.userId = '1'
    AND contacts.trash IS NULL
    AND NOT EXISTS ( SELECT * FROM investments WHERE investments.company IS NULL )
GROUP BY
    contacts.contactId

任何帮助将不胜感激。

【问题讨论】:

  • 在这里看看这个小提琴,我打算添加一个答案,但他们关闭了它。 db-fiddle.com/f/nucna7J1LTX1gMVwiuw1Mf/3
  • 感谢您的意见!这很棒。
  • 当然,就像我说的那样我会给出答案,但它已关闭,再见!

标签: php mysql


【解决方案1】:

inner join 需要连接表中的匹配条目。您需要找到不匹配的条目outer join,而连接表字段的简单 where 条件是null

Outer Joins 组成一个“虚拟记录”,其中连接表的所有 NULL 值都找不到匹配项。例如,如果表 1 的唯一列中有 a、b、c,并且你outer join 使用包含 a-1、b-2 的表 2,你会得到表 1 的前两个条目的匹配项,并且没有匹配项 -> 第三个值的虚拟记录:aa-1、bb-2 , c-NULL-NULL。现在您可以通过添加where 条件来控制您希望看到的结果,例如where table2-col is null,并且只保留第三个匹配项 - c-NULL-NULL。

请注意,它们是left outer joins 和right outer joins,具体取决于您是否希望为左侧或右侧表的不匹配条目创建虚拟对象。 sql允许去掉outer这个词,所以它经常读作left joinright join

【讨论】:

  • 可以澄清一点吗?我对 OUTER Joins 并不完全熟悉。
  • stackoverflow.com/a/38578/6521550 内连接与外连接
  • 你可以放弃inner,直接使用JOIN。我想我应该提一下。
  • 感谢 Aganju,是的,现在说得通了。令人沮丧的是我是如何使用一些简单的东西而只是一个大脑放屁,我想我没有考虑外部连接。一开始的想法完全错了。感谢您对此的帮助!谢谢!
  • 我没有看到太多关于实际 SQL 的内容,不过很好的解释。
【解决方案2】:

您可以通过使用LEFT JOIN 并检查公司是否为NULL 来做到这一点。通过使用LEFT JOIN 而不是INNER JOIN,您仍然会得到contacts,它在investments 表中没有任何内容。

SELECT
    *
FROM
    contacts
LEFT JOIN investments ON investments.contactId = contacts.contactId
WHERE
    contacts.userId = '1'
    AND contacts.trash IS NULL
    AND investments.company IS NULL
GROUP BY
    contacts.contactId

【讨论】:

  • 是的,令人沮丧的错误,我的想法完全不同。 LEFT 连接显然使世界变得不同。所以这是有道理的。和阿甘朱提到的一样。感谢您的帮助!
【解决方案3】:

SELECT * FROM 联系人 c

LEFT JOIN 投资 i ON i.contactId = c.contactId

其中 c.userId = '1' 且 c.trash 为空且 i.company 不为空

按 c.contactId 分组

【讨论】:

    猜你喜欢
    • 2021-09-18
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    相关资源
    最近更新 更多