3表关联查询:实现广播列表的联系人数量统计
三表关联统计广播列表及对应联系人数量
核心思路
由于联系人可归属多个广播列表,必须借助中间关联表broadcast_contact建立broadcast_list和contacts的关联,通过JOIN+GROUP BY实现每个广播列表的联系人数量统计。
最终SQL语句
假设表结构如下(自行替换实际字段名):
contacts:主键contact_idbroadcast_list:主键broadcast_id,名称字段broadcast_namebroadcast_contact:关联字段broadcast_id、contact_id
SELECT bl.broadcast_name, COUNT(DISTINCT bc.contact_id) AS contact_count FROM broadcast_list bl LEFT JOIN broadcast_contact bc ON bl.broadcast_id = bc.broadcast_id LEFT JOIN contacts c ON bc.contact_id = c.contact_id GROUP BY bl.broadcast_id, bl.broadcast_name;
关键细节说明
- LEFT JOIN的作用:用
LEFT JOIN关联广播列表和中间表,确保所有广播列表都被统计,哪怕某个列表没有关联联系人(此时计数为0)。如果只需要统计有联系人的列表,可改为INNER JOIN。 - COUNT(DISTINCT):必须加
DISTINCT,防止同一联系人多次加入同一广播列表时被重复计数。 - GROUP BY字段:必须包含广播列表的主键(
broadcast_id)和名称(broadcast_name),保证分组逻辑准确——避免不同ID但名称相同的列表被错误合并。
特殊情况处理
如果广播列表表名是带空格的Broadcast list,需要用反引号包裹表名:
SELECT `Broadcast list`.broadcast_name, COUNT(DISTINCT bc.contact_id) AS contact_count FROM `Broadcast list` LEFT JOIN broadcast_contact bc ON `Broadcast list`.broadcast_id = bc.broadcast_id LEFT JOIN contacts c ON bc.contact_id = c.contact_id GROUP BY `Broadcast list`.broadcast_id, `Broadcast list`.broadcast_name;
内容的提问来源于stack exchange,提问作者HMS
相关产品推荐
相关产品推荐

