LeetCode--1355. 活动参与者

25 阅读1分钟

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

  1. 使用 group by 分组统计 Friends 表中活动参与人数次数
select count(*) from Friends group by activity

执行结果

+--------+
|count(*)|
+--------+
|3       |
|2       |
|1       |
+--------+
  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可以不用关联查询