Mysql 检索相关表中所有值均为空的记录

Mysql 检索相关表中所有值均为空的记录,mysql,Mysql,我正在寻找一种更有效的方法来构建此查询(双重子查询使我感到畏缩): 让我解释一下这里发生了什么 收件人持有联系人列表。每个联系人可能有多个地址。每个地址都有一个相关的district_values表。我需要检索所有地址的district_values.district列为空的联系人 例如: Contact A Address 1.district = 4 Address 2.district = null = don't include Contact B Address 1.district

我正在寻找一种更有效的方法来构建此查询(双重子查询使我感到畏缩):

让我解释一下这里发生了什么

收件人持有联系人列表。每个联系人可能有多个地址。每个地址都有一个相关的district_values表。我需要检索所有地址的district_values.district列为空的联系人

例如:

Contact A
Address 1.district = 4
Address 2.district = null
= don't include

Contact B
Address 1.district = null
= include

Contact C
Address 1.district = null
Address 2.district = 3
= don't include
我现有查询的逻辑如下:

  • 检索具有相关地址和地区的联系人,进行排序,以便首先对所有具有非空值的地址进行排序
  • 应用分组方式,以便我减少到单个联系人记录,并且如果保留了地区地址
  • 应用where子句删除至少有一个地区值的地址

  • 它可以工作——只是有点难看。

    您可以试试这个,使用LEFT JOIN并计算相关记录,该记录为零

    SELECT mr.contact_id 
        FROM recipients mr 
    LEFT JOIN address a ON mr.contact_id = a.contact_id  
    LEFT JOIN district_values di ON a.id = di.entity_id 
        WHERE mr.mid = 29 
    GROUP BY mr.contact_id
        HAVING COUNT(a.*) = 0 AND COUNT(di.*) = 0
    

    返回联系人没有相关a或di行的记录。我需要的是有链接记录的地方,但是对于所有相关记录,di.district的值都为null。di表中还有其他列--我的限制是对di.district值的限制。我能够适应这一点,它似乎做得更好。我只是将HAVING子句更改为:HAVING COUNT(di.district)=0
    SELECT mr.contact_id 
        FROM recipients mr 
    LEFT JOIN address a ON mr.contact_id = a.contact_id  
    LEFT JOIN district_values di ON a.id = di.entity_id 
        WHERE mr.mid = 29 
    GROUP BY mr.contact_id
        HAVING COUNT(a.*) = 0 AND COUNT(di.*) = 0