LeetCode--1341. 电影评分

72 阅读3分钟

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 解题思路

  1. 统计用户点评电影数量,按照点评电影数量倒序排序,再按照用户名进行排序,最后通过分页获取第一条数据
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 |
+-------+
  1. 统计在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|
+--------+

  1. 使用 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. 收获

  1. 可以在 order by 中使用统计函数进行排序,也可以在 group by 中使用 having 对统计函数进行结果筛选,能实现减少一层 sql 结构