在mySQL中选择不匹配的字段

在mySQL中选择不匹配的字段,mysql,Mysql,我有以下三个表格: 联系人、自定义字段、自定义字段值 对于每个自定义字段,每个联系人可以有一个自定义字段值记录。所以在Contact和Custom_Field_值之间有一个1:多的关系,但并不是那么简单 一切正常-除了一个边缘情况,我需要选择未设置特定自定义字段的联系人(即不存在链接到联系人和自定义字段的相应自定义字段值记录)。这是非常困难的。我不能只使用普通的“左连接并查找NULL”方法,因为它们可能有不同的自定义字段,但不是我要查找的字段。我需要说“Where Custom\u Field\

我有以下三个表格: 联系人、自定义字段、自定义字段值

对于每个自定义字段,每个联系人可以有一个自定义字段值记录。所以在Contact和Custom_Field_值之间有一个1:多的关系,但并不是那么简单

一切正常-除了一个边缘情况,我需要选择未设置特定自定义字段的联系人(即不存在链接到联系人和自定义字段的相应自定义字段值记录)。这是非常困难的。我不能只使用普通的“左连接并查找NULL”方法,因为它们可能有不同的自定义字段,但不是我要查找的字段。我需要说“Where Custom\u Field\u ID=10”,但我不能说,因为我要找的东西不存在

我的思路正朝着这个方向发展,但我现在正陷入困境:

Select ID, First_Name, Last_Name, CF_ID  From 

(

(Select Contact.ID, First_Name, Last_Name, Custom_Field_Value.ID as CFV_ID, Custom_Field_Value.CustomFieldID as CF_ID, TextValue 
From Contact Inner Join Custom_Field_Value on Contact.ID = Custom_Field_Value.ContactID 
Where Custom_Field_Value.CustomFieldID=23 Order By Contact.ID)

UNION

(Select Contact.ID, First_Name, Last_Name, Custom_Field_Value.ID as CFV_ID, Custom_Field_Value.CustomFieldID as CF_ID, TextValue 
From Contact LEFT Join Custom_Field_Value on Contact.ID = Custom_Field_Value.ContactID 
Order by Contact.ID)

) as A


Group BY `ID`, CF_ID ASC
我不想为所有可能的情况创建空白记录,因为可能有数百万条记录,而且每次有人添加自定义字段时,数据库都必须插入数百万条相应的空白记录

如果我们能做到这一点,那就太好了:

Select ID From thingy 
EXCLUDE
Select * From thingy Where x = true

这是一个令人讨厌的问题,但我知道会有人喜欢它:)

好吧,我想我现在有了更好的理解。我试图在没有子查询的情况下完成它,但我不确定是否可以

你能试试吗

Select Contact.ID, First_Name, Last_Name, Custom_Field_Value.ID as CFV_ID, Custom_Field_Value.CustomFieldID as CF_ID, TextValue 
From Contact LEFT Join Custom_Field_Value on Contact.ID = Custom_Field_Value.ContactID 
WHERE NOT EXISTS(SELECT * FROM Custom_Field_Value cfv2 WHERE cfv2.ContactID = Contact.ID AND cfv2.CustomFieldID=23)
Order by Contact.ID

NOT EXISTS子查询应该只返回联系人对该字段没有值的行。

好的,我想我现在有了更好的理解。我试图在没有子查询的情况下完成它,但我不确定是否可以

你能试试吗

Select Contact.ID, First_Name, Last_Name, Custom_Field_Value.ID as CFV_ID, Custom_Field_Value.CustomFieldID as CF_ID, TextValue 
From Contact LEFT Join Custom_Field_Value on Contact.ID = Custom_Field_Value.ContactID 
WHERE NOT EXISTS(SELECT * FROM Custom_Field_Value cfv2 WHERE cfv2.ContactID = Contact.ID AND cfv2.CustomFieldID=23)
Order by Contact.ID

NOT EXISTS子查询应该只返回联系人没有该字段值的行。

这是我最后使用的疯狂SQL—由用户动态创建。只是把它出版,以防对任何人有用。(欢迎提供任何优化建议!):

问题是,我不仅必须选择丢失的动态记录,还必须将左连接查询合并到一个结果中

SELECT * FROM (
    (SELECT * FROM Contact 
        WHERE (...some dynamic stuff...) 
    ) 
    UNION All 
   (SELECT Contact.* FROM Contact Inner Join Contact_Campaign_Link ON Contact.ID=Contact_Campaign_Link.Contact_ID 
       WHERE ((Campaign_ID=31))
   ) 
UNION All 
    (SELECT * FROM Contact 
        WHERE (CustomerID=3) 
        AND (NOT EXISTS 
            (SELECT * FROM Custom_Field_Value cfv2 
                WHERE (cfv2.ContactID = Contact.ID) 
                AND (cfv2.CustomFieldID =27) )) ORDER BY Contact.ID)
            ) As tbl 

GROUP BY tbl.ID HAVING COUNT(*)=3 Order by ID

这就是我最终得到的疯狂SQL——由用户动态创建。只是把它出版,以防对任何人有用。(欢迎提供任何优化建议!):

问题是,我不仅必须选择丢失的动态记录,还必须将左连接查询合并到一个结果中

SELECT * FROM (
    (SELECT * FROM Contact 
        WHERE (...some dynamic stuff...) 
    ) 
    UNION All 
   (SELECT Contact.* FROM Contact Inner Join Contact_Campaign_Link ON Contact.ID=Contact_Campaign_Link.Contact_ID 
       WHERE ((Campaign_ID=31))
   ) 
UNION All 
    (SELECT * FROM Contact 
        WHERE (CustomerID=3) 
        AND (NOT EXISTS 
            (SELECT * FROM Custom_Field_Value cfv2 
                WHERE (cfv2.ContactID = Contact.ID) 
                AND (cfv2.CustomFieldID =27) )) ORDER BY Contact.ID)
            ) As tbl 

GROUP BY tbl.ID HAVING COUNT(*)=3 Order by ID

我不能,因为那里可能有一条记录:)可能有2条自定义字段记录,联系人可能有一条,但我需要知道的另一条不见了。所以我会得到另一张唱片。我唯一能想到的另一种方法是,我循环所有其他自定义字段,然后“and(CustomFieldID 1)和(CustomFieldID 2)…省略我需要的一个”更新了答案,希望它会有帮助-最后一件事是必需的。在主查询中选择DISTINCT。我不能,因为可能有一条记录:)可能有2条自定义字段记录,联系人可能有一条,但我需要知道的另一条记录不见了。所以我会得到另一张唱片。我唯一能想到的另一种方法是,我循环所有其他自定义字段,然后“and(CustomFieldID 1)和(CustomFieldID 2)…省略我需要的一个”更新了答案,希望它会有帮助-最后一件事是必需的。在主查询中选择DISTINCT。在
中选择DISTINCT Contact.*从Contact LEFT JOIN Custom_Field_Value
中,您可能甚至不需要
LEFT JOIN
。然后你就不再需要
不同的
了。谢谢,你完全正确。我已经更新了最终结果:它几乎开始变得简单。在
中选择DISTINCT Contact.*从Contact LEFT JOIN Custom_Field_Value
,您甚至可能不需要
LEFT JOIN
。然后你就不再需要
不同的
了。谢谢,你完全正确。我已经更新了最终结果:它几乎开始看起来简单了。