跳至主要內容

182. 查找重复的电子邮箱


182. 查找重复的电子邮箱

🟢   🔖  数据库  🔗 力扣open in new window LeetCodeopen in new window

题目

Table: Person

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| email       | varchar |
+-------------+---------+

id is the primary key (column with unique values) for this table.

Each row of this table contains an email. The emails will not contain uppercase letters.

Write a solution to report all the duplicate emails. Note that it's guaranteed that the email field is not NULL.

Return the result table in any order.

The result format is in the following example.

Example 1:

Input:

Person table:

+----+---------+
| id | email   |
+----+---------+
| 1  | a@b.com |
| 2  | c@d.com |
| 3  | a@b.com |
+----+---------+

Output:

+---------+
| Email   |
+---------+
| a@b.com |
+---------+

Explanation: a@b.com is repeated two times.

题目大意

表: Person

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| email       | varchar |
+-------------+---------+

id 是该表的主键(具有唯一值的列)。

此表的每一行都包含一封电子邮件。电子邮件不包含大写字母。

编写解决方案来报告所有重复的电子邮件。 请注意,可以保证电子邮件字段不为 NULL。

任意顺序 返回结果表。

结果格式如下例。

示例 1:

输入:

Person 表:

+----+---------+
| id | email   |
+----+---------+
| 1  | a@b.com |
| 2  | c@d.com |
| 3  | a@b.com |
+----+---------+

输出:

+---------+
| Email   |
+---------+
| a@b.com |
+---------+

解释: a@b.com 出现了两次。

解题思路

  • SELECT email:查询结果中只需要返回重复的邮箱字段。
  • FROM Person:从 Person 表中读取数据。
  • GROUP BY email 使用 GROUP BYemail 字段进行分组,将具有相同邮箱的记录分为一组。
  • HAVING COUNT(email) > 1 表示只选择那些重复出现的邮箱。
    • 利用 COUNT(email) 统计每组中的记录数量。
    • 使用 HAVING 子句筛选出记录数大于 1 的组。

复杂度分析

  • 时间复杂度O(n),其中 n 是表中记录的行数。分组和计数操作需要扫描所有行。
  • 空间复杂度O(k),其中 k 是分组的数量,存储每个分组的计数结果需要额外空间。

代码

SELECT email
FROM Person
GROUP BY email
HAVING COUNT(email) > 1