1 题目描述
表: Friends
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| name | varchar |
| activity | varchar |
+---------------+---------+
id 是朋友的 id,并且在 SQL 中,是该表的主键 name 是朋友的名字 activity 是朋友参加的活动的名字
表: Activities
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| name | varchar |
+---------------+---------+
在 SQL 中,id 是该表的主键 name 是活动的名字
找出那些既没有最多,也没有最少参与者的活动的名字。
Activities
表中的任意活动都有在 Friends
中参与过。
可以以 任何顺序 返回结果。
2 测试用例
输入:
Friends 表:
+------+--------------+---------------+
| id | name | activity |
+------+--------------+---------------+
| 1 | Jonathan D. | Eating |
| 2 | Jade W. | Singing |
| 3 | Victor J. | Singing |
| 4 | Elvis Q. | Eating |
| 5 | Daniel A. | Eating |
| 6 | Bob B. | Horse Riding |
+------+--------------+---------------+
Activities 表:
+------+--------------+
| id | name |
+------+--------------+
| 1 | Eating |
| 2 | Singing |
| 3 | Horse Riding |
+------+--------------+
输出:
+--------------+
| activity |
+--------------+
| Singing |
+--------------+
解释: Eating 活动有三个人参加, 是最多人参加的活动 (Jonathan D. , Elvis Q. and Daniel A.) Horse Riding 活动有一个人参加, 是最少人参加的活动 (Bob B.) Singing 活动有两个人参加 (Victor J. and Jade W.)
3 解题思路
- 使用
group by
分组统计Friends
表中活动参与人数次数
select count(*) from Friends group by activity
执行结果
+--------+
|count(*)|
+--------+
|3 |
|2 |
|1 |
+--------+
- 使用
any()
函数,将参与人数最多和最少的活动排除,就能查询出符合题目要求的活动名称
select activity
from Friends
group by activity
having count(*) >
any (select count(*) from Friends group by activity)
and count(*) <
any (select count(*) from Friends group by activity)
执行结果
+--------+
|activity|
+--------+
|Singing |
+--------+
注意:题目中有提到 Activities 表中的任意活动都有在 Friends
中参与过,Activities可以不用关联查询