选择表中没有“X”的所有联系人

时间:2017-11-02 00:02:25

标签: php mysql

我正在尝试在我的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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

inner join需要在已连接的表中使用匹配的条目。您需要找到不匹配的条目outer join,并且联接表的字段上的简单where条件为null

Outer Join组成一个'虚拟记录',其中包含联接表的所有NULL值,其中找不到匹配项。例如,如果表1中的a,b,c位于唯一列中,以及outer join表2包含a-1,b-2,您将获得表1的前两个条目的匹配,并且不匹配 - >第三个值的虚拟记录:a-a-1,b-b-2,c-NULL-NULL。现在,您可以通过添加where条件来控制要查看的结果,例如where table2-col is null,只剩下第三个匹配 - c-NULL-NULL。

请注意,它们是left outer joinright outer join,具体取决于您是否希望为左侧或右侧表格的不匹配条目创建虚拟对象。 Sql允许删除单词outer,因此通常会显示left joinright join

答案 1 :(得分:1)

您可以使用LEFT JOIN并检查公司是否为空来执行此操作。使用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

答案 2 :(得分:1)

SELECT * FROM contacts c

LE OFF JOIN投资i ON.contactId = c.contactId

WHERE c.userId ='1'AND c.trash IS NULL且i.company IS NOT NULL

GROUP BY c.contactId