MySQL中按Table_A分组后统计Table_B关联列的去重计数
MySQL分组关联统计去重值数量解决方案
假设你的表结构大致如下:
- Table_A:包含分组字段
group_column、关联ID字段a_id - Table_B:包含关联ID字段
a_id、需要统计去重的目标字段target_column
下面提供几种可行的实现方法:
方法1:LEFT JOIN + COUNT(DISTINCT)
这是最直接的写法,适合需要保留Table_A所有分组的场景(即使分组在Table_B中无对应数据):
SELECT ta.group_column, COUNT(DISTINCT tb.target_column) AS unique_count FROM Table_A ta LEFT JOIN Table_B tb ON ta.a_id = tb.a_id GROUP BY ta.group_column;
如果只需要统计Table_B中有匹配数据的分组,把LEFT JOIN替换为INNER JOIN即可。
方法2:子查询预统计后关联
先在子查询中按关联ID算出每个ID对应的去重值数量,再和Table_A关联分组,逻辑更清晰,适合复杂关联场景:
SELECT ta.group_column, COALESCE(tb_stats.unique_count, 0) AS unique_count FROM Table_A ta LEFT JOIN ( SELECT a_id, COUNT(DISTINCT target_column) AS unique_count FROM Table_B GROUP BY a_id ) tb_stats ON ta.a_id = tb_stats.a_id GROUP BY ta.group_column;
COALESCE用来将无匹配时的NULL转为0,避免结果出现空值。
方法3:字段级子查询统计
如果场景简单,也可以直接在SELECT字段中嵌套子查询完成统计:
SELECT group_column, (SELECT COUNT(DISTINCT target_column) FROM Table_B tb WHERE tb.a_id = ta.a_id) AS unique_count FROM Table_A ta GROUP BY group_column;
内容的提问来源于stack exchange,提问作者Sakib Shahriar
相关产品推荐
相关产品推荐

