Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
题目来源:LeetCode>查找重复的电子邮箱
编写一个 SQL 查询,查找 Person 表中所有重复的电子邮箱。
示例:
| Id | |
|---|---|
| 1 | a@b.com |
| 2 | c@d.com |
| 3 | a@b.com |
根据以上输入,你的查询应返回以下结果:
| 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的话是没办法使用的。