SQL查询需求:找出子节点数量少于2的user_id
查询子节点数量少于2的user_id SQL语句
表结构
| id | user_id | parent_id | club |
|---|---|---|---|
| 1 | 1 | club1 | |
| 2 | 2 | 1 | club1 |
| 3 | 3 | 1 | club1 |
| 4 | 4 | 2 | club1 |
| 5 | 5 | 2 | club1 |
| 6 | 6 | 3 | club1 |
| 7 | 7 | 3 | club1 |
| 8 | 8 | 4 | club1 |
| 9 | 9 | 4 | club1 |
| 10 | 10 | 5 | club1 |
| 11 | 11 | 5 | club1 |
| 12 | 12 | 6 | club1 |
| 13 | 13 | 6 | club1 |
| 14 | 14 | 7 | club1 |
| 15 | 15 | 7 | club1 |
需求说明
需要查询子节点数量少于2的user_id。根据表中数据,user_id为1、2、3、4、5、6、7的节点均拥有2个子节点,因此查询结果应返回8、9、10、11、12、13、14、15。
解决方案
方法一:自连接统计子节点数
通过自连接关联父节点与子节点,统计每个user_id的子节点数量,再筛选出数量少于2的:
SELECT u.user_id FROM your_table u LEFT JOIN your_table c ON u.user_id = c.parent_id GROUP BY u.user_id HAVING COUNT(c.user_id) < 2;
逻辑说明:
- 用
LEFT JOIN确保所有user_id都被包含,即使没有子节点 COUNT(c.user_id)统计每个父节点对应的子节点数量HAVING子句过滤出子节点数小于2的user_id
方法二:排除拥有2个及以上子节点的父节点
先找出所有拥有2个及以上子节点的parent_id,再查询不在该集合中的user_id:
SELECT user_id FROM your_table WHERE user_id NOT IN ( SELECT parent_id FROM your_table WHERE parent_id IS NOT NULL GROUP BY parent_id HAVING COUNT(*) >= 2 );
逻辑说明:
- 子查询筛选出所有有2个及以上子节点的父节点
- 外层查询排除这些父节点,剩下的就是子节点数少于2的user_id
- 添加
parent_id IS NOT NULL避免空值干扰
内容的提问来源于stack exchange,提问作者Tausif Ahmad
相关产品推荐
相关产品推荐

