一.情况描述
主管—》代理员 —》发展用户
主管—》发展用户
描述主管可以通过发展代理员进行发展用户 也可以直接发展用户
现需要统计当前所有主管的发展用户数top30 其中需要包含主管单独发展的用户数
二.sql语句
SELECT IFNULL(c.distri_user_id, c.user_id) AS userId, count(*) AS userCount
FROM sys_user b
JOIN sys_user c ON b.recommender_user_id = c.user_id
WHERE c.distri_user_id IS NOT NULL
OR c.new_flag = 30
GROUP BY userId
ORDER BY userCount DESC
LIMIT 30
三.分析
- 其中别称 b为发展用户 c为代理员/主管 使用内连接进行查询
- 关联条件为 b.recommender_user_id=c.user_id 其中发展用户的recommender_user_id是指推荐人id,
c.user_id为用户id可能为代理员也可能为主管 - 接下来 where语句 c.distri_user_id is not null or c.new_flag=30 筛选出符合条件的代理员或者主管
c.distri_user_id 字段为上级用户id 非空说明该用户为代理员级别,c.new_flag=30 new_flag是一个标识身份的字段说明等于3说明是主管身份 - 继续 group by userId 此处如果不加其他处理获得是将是 代理员和主管的统计,通过select 中使用 IFNULL(c.distri_user_id,c.user_id) as userId,可以巧妙的解决该问题,如果有上级id(distri_user_id)则使用上级字段,如果没有该字段说明为主管用户直接发展的用户,直接使用该user_id即可。
- 最后order by userCount desc 根据用户数进行倒叙排序 , limit 30 取前30 个数据即可完成。