使用力扣-SQL 602.好友申请Ⅱ来说明一下Mysql
中的Union
和Union All
的用法和它们的区别
Union
在Mysql中Union的作用是将多个select查询的结果连接放置在一个结果集当中,不过会去除重复列,这个去重的逻辑是这样的:假如选取的是一列内容,只会保留一列内容中非重复项,假如选取的是多列内容,那么保留的是多列组合的非重复项。
以602.好友申请Ⅱ为例子来查看一下Union的作用
首先是选取一列的时候
select requester_id as id
from RequestAccepted
union select accepter_id as id
from RequestAccepted
输入:
requester_id | accepter_id | accept_date |
---|---|---|
1 | 2 | 2016/06/03 |
1 | 3 | 2016/06/08 |
2 | 3 | 2016/06/08 |
3 | 4 | 2016/06/09 |
输出:
| id |
| — |
| 1 |
| 2 |
| 3 |
| 4 |
可以看见将 requester_id和accepter_id的结果都组合到了一列中,同时只保留了非重复元素
接下来是选取两列元素的情况
select requester_id as id,accept_date
from RequestAccepted
union select accepter_id as id,accept_date
from RequestAccepted
输出:
| id | accept_date |
| — | ———– |
| 1 | 2016-06-03 |
| 1 | 2016-06-08 |
| 2 | 2016-06-08 |
| 3 | 2016-06-09 |
| 2 | 2016-06-03 |
| 3 | 2016-06-08 |
| 4 | 2016-06-09 |
可以看见,对于两个(3,2016-06-08)其只保留了其中的一个,会对两个元素的组合去重。
Union ALL
介绍完Union,再来说Union ALL就非常的简单,Union ALL与Union的区别就在于 Union会去除重复元素,而Union ALL则会返回所有元素。
将以上选取两列的SQL使用Union ALL改写一下后得到的数据效果:
select requester_id as id,accept_date
from RequestAccepted
union all
select accepter_id as id,accept_date
from RequestAccepted
输出内容:
| id | accept_date |
| — | ———– |
| 1 | 2016-06-03 |
| 1 | 2016-06-08 |
| 2 | 2016-06-08 |
| 3 | 2016-06-09 |
| 2 | 2016-06-03 |
| 3 | 2016-06-08 |
| 3 | 2016-06-08 |
| 4 | 2016-06-09 |
这次,其返回的数据集就是没有去重的。
602.好友申请Ⅱ题解
RequestAccepted
表:
+----------------+---------+ | Column Name | Type | +----------------+---------+ | requester_id | int | | accepter_id | int | | accept_date | date | +----------------+---------+ (requester_id, accepter_id) 是这张表的主键(具有唯一值的列的组合)。 这张表包含发送好友请求的人的 ID ,接收好友请求的人的 ID ,以及好友请求通过的日期。
编写解决方案,找出拥有最多的好友的人和他拥有的好友数目。
生成的测试用例保证拥有最多好友数目的只有 1 个人。
对于以上的题目与要求使用Union ALL就非常简单的解决啦~
with tmp as(
select requester_id as id
from RequestAccepted
union all
select accepter_id as id
from RequestAccepted
)
select id,count(1) as num
from tmp
group by id
order by num desc limit 1