结合HAVING子句多表查询:获取重复阻塞邮箱的联系人详情
从Contact表筛选符合条件的联系人详情
表结构
Contact表
| 字段名 | 说明 |
|---|---|
| Id | 主键 |
| FirstName | 名 |
| LastName | 姓 |
| 邮箱 | |
| JobTitle | 职位 |
BlockedEntries表
| 字段名 | 说明 |
|---|---|
| Id | 主键 |
| 被封禁邮箱 |
需求与现有问题
需要从Contact表中找出同时满足以下两个条件的记录,并返回完整联系人详情:
- 邮箱存在于BlockedEntries表中
- 该邮箱在Contact表中出现次数超过1次
现有查询语句仅能统计邮箱出现次数和关联ID集合,无法返回具体联系人信息:
SELECT email, COUNT(*) as cc, GROUP_CONCAT( id SEPARATOR '#') AS ContactIds FROM contacts where email IN (SELECT email FROM BlockedEntries) GROUP BY email HAVING COUNT(*) > 1
示例数据
Contact表数据
| Id | FirstName | LastName | JobTitle | |
|---|---|---|---|---|
| 12 | sam | j | samj@gmail.com | engineer |
| 23 | bos | j | bosj@gmail.com | accountnt |
| 34 | cas | j | samj@gmail.com | engineer |
| 33 | xxx | j | bosj@gmail.com | fied |
| 55 | dfe | c | dfe@gmail.com | student |
BlockedEntries表数据
| Id | CreateDate | |
|---|---|---|
| 1 | samj@gmail.com | 09/12/2020 19:30:20 |
| 2 | bosj@gmail.com | 09/12/2020 19:30:20 |
| 3 | dfe@gmail.com | 09/12/2020 19:30:20 |
期望结果
| Id | FirstName | LastName | JobTitle | |
|---|---|---|---|---|
| samj@gmail.com | 12 | sam | j | engineer |
| samj@gmail.com | 34 | cas | j | engineer |
| bosj@gmail.com | 23 | bos | j | accountnt |
| bosj@gmail.com | 33 | xxx | j | fied |
注:dfe@gmail.com在Contact表中仅出现1次,不纳入结果集
解决方案
方法1:子查询关联
先筛选出符合条件的邮箱集合,再关联原表获取完整数据:
SELECT c.Email, c.Id, c.FirstName, c.LastName, c.JobTitle FROM Contact c JOIN ( -- 筛选:在封禁列表中,且在Contact表中出现次数>1的邮箱 SELECT Email FROM Contact WHERE Email IN (SELECT Email FROM BlockedEntries) GROUP BY Email HAVING COUNT(*) > 1 ) filtered_emails ON c.Email = filtered_emails.Email
方法2:窗口函数(性能更优)
通过窗口函数一次性计算邮箱出现次数和封禁状态,直接过滤出目标数据:
SELECT Email, Id, FirstName, LastName, JobTitle FROM ( SELECT Email, Id, FirstName, LastName, JobTitle, COUNT(*) OVER (PARTITION BY Email) AS email_count, EXISTS (SELECT 1 FROM BlockedEntries be WHERE be.Email = Contact.Email) AS is_blocked FROM Contact ) t WHERE email_count > 1 AND is_blocked = 1
说明
- 方法1逻辑直观,适合数据量较小的场景
- 方法2无需额外关联操作,在大数据量下性能更出色
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

