1355.活动参与者
一、题目链接
二、题目描述
表: 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 中参与过。
可以以 任何顺序 返回结果。
下面是返回结果格式的例子。
示例 1:
输入:
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.)
三、建表语句
Create table If Not Exists Friends (id int, name varchar(30), activity varchar(30));
Create table If Not Exists Activities (id int, name varchar(30));
Truncate table Friends;
insert into Friends (id, name, activity) values ('1', 'Jonathan D.', 'Eating');
insert into Friends (id, name, activity) values ('2', 'Jade W.', 'Singing');
insert into Friends (id, name, activity) values ('3', 'Victor J.', 'Singing');
insert into Friends (id, name, activity) values ('4', 'Elvis Q.', 'Eating');
insert into Friends (id, name, activity) values ('5', 'Daniel A.', 'Eating');
insert into Friends (id, name, activity) values ('6', 'Bob B.', 'Horse Riding');
Truncate table Activities;
insert into Activities (id, name) values ('1', 'Eating');
insert into Activities (id, name) values ('2', 'Singing');
insert into Activities (id, name) values ('3', 'Horse Riding');
四、题目解答
1、思路1讲解
先使用CTE表达式,将活动名和参加该活动的人数作为临时子表,因为主查询和where子查询都要用到经过处理的包含count(*)的表,所以使用cte表达式简化代码。
CTE临时表结果如下
activity | tn |
---|---|
Eating | 3 |
Singing | 2 |
Horse Riding | 1 |
然后在主查询中使用where子查询
筛选出等于最多人数和最小人数的活动最后输出
2、代码1实现
with t1 as (select activity,count(*) as tn from Friends group by activity)
select
activity
from t1
where tn<>(select max(tn) from t1) and tn <>(select min(tn) as tn from t1);
3、思路2讲解
使用having加any配合子查询,any()函数的意思是,只要左边的值与右边中的值有任意一个匹配就输出
然后本体中使用只要having count大于any子查询中的count和小于any子查询中的count排除掉最大值和最小值就可以了
4、代码2实现
select
activity
from Friends
group by activity
having count(*)>any(select count(*) from Friends)
and count(*)<any(select count(*) from Friends)
五、知识总结
①CTE表达式的运用
with 表1别名 as ( 子查询1),
表2别名 as (子查询2),
.......
select
........(主查询)
from
②any函数的运用
any()就代表任意的意思,只要等于任意其中之一就输出
标签:insert,name,into,1355,力扣,activity,Friends,id,参与者
From: https://blog.csdn.net/m0_45220893/article/details/143251351