【刷题记录】7.查找重复的电子邮箱

156 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

题目来源:LeetCode>查找重复的电子邮箱

编写一个 SQL 查询,查找 Person 表中所有重复的电子邮箱。

示例:

IdEmail
1a@b.com
2c@d.com
3a@b.com

根据以上输入,你的查询应返回以下结果:

Email
a@b.com

说明:所有电子邮箱都是小写字母。

二、思路分析:

思路:使用GROUP BY 和临时表

首先第一步,统计出每封电子邮箱出现的次数,代码:

SELECT
	Email,
	count( Email ) AS num 
FROM
	Person 
GROUP BY
	Email;

第二步,筛选出出现次数大于1的电子邮箱。

三、AC 代码:

SELECT
	Email 
FROM
	( SELECT Email, count( Email ) AS num FROM Person GROUP BY Email ) AS t1 
WHERE
	num > 1;

四、总结:

解决思路都是一步一步分解得来的,在此基础之上,也有更优的解决办法,使用group by ... having ...子句解决,可以直接对分组的数据进行条件筛选,以下为代码:

SELECT
	Email 
FROM
	Person 
GROUP BY
	Email 
HAVING
	count( Email ) > 1;

也有更为简单直接的办法:

SELECT DISTINCT
	( p1.Email ) 
FROM
	Person p1
	JOIN Person p2 ON p1.Email = p2.Email 
	AND p1.Id != p2.Id;

再列举一个少见的方法,创建临时表:

WITH temp AS ( SELECT email, count( email ) num FROM person GROUP BY email ) SELECT
email 
FROM
	temp 
WHERE
	num > 1;

对于with的用法,其主要作用在于代码模块化、代码可读性增强、相同查询唯一化。

但是with子句查询是从MySQL 8.0才开始支持,故版本低于8.0的话是没办法使用的。