首页新闻找找看学习计划

mysql 分组统计的问题

0
[已解决问题] 解决于 2020-01-13 18:16

三张表 用户,资源,任务表,主要字段如下,(时间的格式是时间戳,不用过多纠结)

user----userId ,username,group
res---resId,userId,create_time
mission ---mId,userId,create_time
现在要统计在某一时间段内,特定group人群的资源数和任务数量
注:不是所有人都有资源或者任务,但是要统计所有人,没有资源或任务的显示为0,这样的sql该怎么写

下面是我的sql

统计res
SELECT userId,userName,COUNT(resId) FROM user
LEFT JOIN res ON user.userId = res.userId
WHERE user.group = xxx
AND res.create_time BETWEEN 1567267200 AND 1578882077
GROUP BY user.userId

出现的问题:
很多用户没有资源就显示不出来了 sql哪里出现问题了

大宇007的主页 大宇007 | 菜鸟二级 | 园豆:331
提问于:2020-01-13 17:09
< >
分享
最佳答案
0

where条件的问题,where会对left join生成的数据做过滤
很多用户没有资源 => left join之后的数据res.create_time为null

奖励园豆:5
大志若愚 | 小虾三级 |园豆:1062 | 2020-01-13 17:35

那应该怎么改

大宇007 | 园豆:331 (菜鸟二级) | 2020-01-13 17:51

就是查出来的只是有数据的,res不存在或者不在范围的不显示了
怎么写可以查出 userId,username,count(res) 的全部信息让res不存在显示为0

大宇007 | 园豆:331 (菜鸟二级) | 2020-01-13 17:57

@大宇007:
SELECT user.userId,user.userName, ifnull(T.resCount, 0) as resCount FROM user
LEFT JOIN
(
SELECT userId,COUNT(resId) as resCount FROM user
LEFT JOIN res ON user.userId = res.userId
WHERE user.group = xxx
AND res.create_time BETWEEN 1567267200 AND 1578882077
GROUP BY user.userId
) as T ON T.userId = user.userId where user.group = xxx
要学会思考

大志若愚 | 园豆:1062 (小虾三级) | 2020-01-13 18:00

@大志若愚: 谢谢,明白了

大宇007 | 园豆:331 (菜鸟二级) | 2020-01-13 18:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册