1、问题描述
一个video表,里面有三个字段user_id、video_id、start_time
表里面的一行记录表示的是某个user在在某个time看了某个video
要求:今天看不同视频数量超过100个的用户id的前三名
2、问题分析
- 今天:查询条件带有时间范围控制
- 不同视频:在相同用户下可能会出现重复查看视频,记得去重
- 超过100:去重过后总数要大于100
- 前三名:排序取出前三
隐藏问题:分组 group by
3、问题分步解析
起始时间 {datetime格式}
-
今天:查询条件时间举例
to_days(起始时间) <= to_days(now());使用to_days()函数
昨天:to_days(NOW()) - TO_DAYS(起始时间) <= 1
近30天:DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(起始时间戳)等等
-
不同视频:去重方式 ‘distinct 去重字段’ count(distinct 去重字段) 计算不重复总数
-
超过100:即count(distinct 去重字段) >100
-
前三名:使用 ‘order by 字段名’ 排序,desc 降序 asc 升序,取出前三 使用limit 3 限制一下即可
4、问题解决
SELECT user_id, COUNT(DISTINCT video_id) AS 总数
FROM video
WHERE TO_DAYS(start_time)<=TO_DAYS(NOW())
GROUP BY user_id
HAVING COUNT(DISTINCT video_id)>100
ORDER BY COUNT(DISTINCT video_id) DESC
LIMIT 3;