VIRTUALS

the virtual labs for the virtuals

0%

LeetCode 182. 查找重复的电子邮箱

摘要:
考查自连接、GROUP BY、临时表、HAVING子句的使用。

题目

LeetCode 182. 查找重复的电子邮箱

自连接

1
2
3
4
5
# Write your MySQL query statement below

select distinct(a.Email) from Person a inner join Person b
on a.Email = b.Email
and a.id != b.id

使用自连接,因为要找到重复 Email,故可以把 Email 作为连接条件。另外要确保 Id 不同。

GROUP BY + 临时表

1
2
3
4
5
6
select temp.email as Email from
(
select Email as email, count(Email) as count from Person
group by Email
) as temp
where temp.count > 1;

我们的目的是查找重复邮箱,很显然可以想到使用 GROUP BYEmail 字段进行合并分组。GROUP BY 后相同 Email 会合并为一组,每组包括所有不同 Id。我们给 Id 计数可得每组数量。
将上述操作作为一个子查询生成一张临时表,从该表中选择查询即可得到我们想要的结果。

GROUP BY + HAVING 子句

我们分组之后可以不借助临时表而是直接使用 HAVING 子句对分组后的状态进行筛选查询:

1
2
3
4
select p.Email
from Person as p
group by p.Email
having count(p.id) > 1;