MySQL查询需求:父子行customer_id全同时返回值否则为NULL
需求说明
现有数据表包含id、parent_id、customer_id三列,需查询所有parent_id为0的父行,规则如下:
- 若父行的
customer_id与它的所有子行customer_id完全一致,返回该customer_id值 - 若存在不一致的情况,返回
NULL(或0)
输入数据示例
| 描述 | id | parent_id | customer_id |
|---|---|---|---|
| 这是一条父行 | 1 | 0 | 101 |
| 这是id为1的行的子行 | 2 | 1 | 101 |
| 这是id为1的行的子行 | 3 | 1 | 101 |
| 这是一条父行 | 4 | 0 | 103 |
| 这是id为4的行的子行 | 5 | 4 | 104 |
| 这是id为4的行的子行 | 6 | 4 | 104 |
| 这是一条父行 | 7 | 0 | 101 |
| 这是id为7的行的子行 | 8 | 7 | 104 |
| 这是id为7的行的子行 | 9 | 7 | 101 |
期望查询结果
| id | customer_id |
|---|---|
| 1 | 101 |
| 4 | NULL |
| 7 | NULL |
解决方案
这里提供通用SQL实现,通过分组聚合结合条件判断完成需求:
SELECT p.id, CASE WHEN COUNT(DISTINCT c.customer_id) = 1 AND MAX(c.customer_id) = p.customer_id THEN p.customer_id ELSE NULL -- 需要返回0的话替换为ELSE 0即可 END AS customer_id FROM your_table p LEFT JOIN your_table c ON p.id = c.parent_id WHERE p.parent_id = 0 GROUP BY p.id, p.customer_id;
逻辑说明
- 关联父子行:用
LEFT JOIN将父行(parent_id=0)与对应的所有子行关联,确保无子女的父行也能被查询到 - 分组聚合:按父行的
id和customer_id分组,统计子行中不同customer_id的数量 - 条件判断:
- 若子行的
customer_id只有唯一值,且与父行的customer_id完全匹配,返回父行的customer_id - 只要子行存在与父行不一致的
customer_id,或子行有多种customer_id,就返回NULL(或0)
- 若子行的
内容的提问来源于stack exchange,提问作者Łukasz
相关产品推荐
相关产品推荐

