题目
表: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 平均评分最高 的电影名称。如果出现平局,返回字典序较小的电影名称。 字典序 ,即按字母在字典中出现顺序对字符串排序,字典序较小则意味着排序靠前。
返回结果格式如下例所示。
示例 1:
输入: 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 的字典序比较小。
题解
sql
-- 两个结果集无关 考虑使用union
(SELECT `t`.`results`
FROM (SELECT `u`.`name` AS `results`, COUNT(1) AS `cnt`
FROM `MovieRating` `mr`
INNER JOIN `Users` `u` ON `mr`.`user_id` = `u`.`user_id`
GROUP BY `u`.`user_id`, `u`.`name`) `t`
ORDER BY `t`.`cnt` DESC, `t`.`results`
LIMIT 1)
-- 电影名和人名可能一样
UNION ALL
(SELECT `t`.`results`
FROM (SELECT `m`.`title` AS `results`, AVG(`mr`.`rating`) AS `cnt`
FROM `MovieRating` `mr`
INNER JOIN `Movies` `m`
ON `mr`.`movie_id` = `m`.`movie_id` AND DATE_FORMAT(`mr`.`created_at`, '%Y-%m') = '2020-02'
GROUP BY `m`.`movie_id`, `m`.`title`) `t`
ORDER BY `t`.`cnt` DESC, `t`.`results`
LIMIT 1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18