1 题目描述
表:Movies
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| movie_id | int |
| title | varchar |
+---------------+---------+
movie_id 是这个表的主键(具有唯一值的列)。 title 是电影的名字。
表:Users
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| user_id | int |
| name | varchar |
+---------------+---------+
user_id 是表的主键(具有唯一值的列)。
表:MovieRating
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| movie_id | int |
| user_id | int |
| rating | int |
| created_at | date |
+---------------+---------+
(movie_id, user_id) 是这个表的主键(具有唯一值的列的组合)。 这个表包含用户在其评论中对电影的评分 rating 。 created_at 是用户的点评日期。
请你编写一个解决方案:
- 查找评论电影数量最多的用户名。如果出现平局,返回字典序较小的用户名
- 查找在
February 2020平均评分最高 的电影名称。如果出现平局,返回字典序较小的电影名称 字典序 ,即按字母在字典中出现顺序对字符串排序,字典序较小则意味着排序靠前
2 测试用例
输入:
Movies 表:
+-------------+--------------+
| movie_id | title |
+-------------+--------------+
| 1 | Avengers |
| 2 | Frozen 2 |
| 3 | Joker |
+-------------+--------------+
Users 表:
+-------------+--------------+
| user_id | name |
+-------------+--------------+
| 1 | Daniel |
| 2 | Monica |
| 3 | Maria |
| 4 | James |
+-------------+--------------+
MovieRating 表:
+-------------+--------------+--------------+-------------+
| movie_id | user_id | rating | created_at |
+-------------+--------------+--------------+-------------+
| 1 | 1 | 3 | 2020-01-12 |
| 1 | 2 | 4 | 2020-02-11 |
| 1 | 3 | 2 | 2020-02-12 |
| 1 | 4 | 1 | 2020-01-01 |
| 2 | 1 | 5 | 2020-02-17 |
| 2 | 2 | 2 | 2020-02-01 |
| 2 | 3 | 2 | 2020-03-01 |
| 3 | 1 | 3 | 2020-02-22 |
| 3 | 2 | 4 | 2020-02-25 |
+-------------+--------------+--------------+-------------+
输出: Result 表:
+--------------+
| results |
+--------------+
| Daniel |
| Frozen 2 |
+--------------+
解释: Daniel 和 Monica 都点评了 3 部电影("Avengers", "Frozen 2" 和 "Joker") 但是 Daniel 字典序比较小 Frozen 2 和 Joker 在 2 月的评分都是 3.5,但是 Frozen 2 的字典序比较小
3 解题思路
- 统计用户点评电影数量,按照点评电影数量倒序排序,再按照用户名进行排序,最后通过分页获取第一条数据
select u.name as results
from MovieRating as mr
join Users as u on mr.user_id = u.user_id
group by u.name
order by count(*) desc, u.name asc
limit 0,1
执行结果
+-------+
|results|
+-------+
|Daniel |
+-------+
- 统计在2020-02被点的电影,统计点评平均分进行倒序排序,再按照电影名称进行排序,最后通过分页获取第一条数据
select distinct m.title as results
from MovieRating as mr
join Movies as m on mr.movie_id = m.movie_id
where date_format(mr.created_at, '%Y-%m') = '2020-02'
group by m.title
order by avg(mr.rating) desc, m.title asc
limit 0,1
执行结果
+--------+
|results |
+--------+
|Frozen 2|
+--------+
- 使用 union all 合并步骤 1 和 2 的结果
(select u.name as results
from MovieRating as mr
join Users as u on mr.user_id = u.user_id
group by u.name
order by count(*) desc, u.name asc
limit 0,1)
union all
(select distinct m.title as results
from MovieRating as mr
join Movies as m on mr.movie_id = m.movie_id
where date_format(mr.created_at, '%Y-%m') = '2020-02'
group by m.title
order by avg(mr.rating) desc, m.title asc
limit 0,1);
执行结果
+--------+
|results |
+--------+
|Daniel |
|Frozen 2|
+--------+
4. 收获
- 可以在
order by中使用统计函数进行排序,也可以在group by中使用having对统计函数进行结果筛选,能实现减少一层 sql 结构