You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

结合HAVING子句多表查询:获取重复阻塞邮箱的联系人详情

从Contact表筛选符合条件的联系人详情

表结构

Contact表

字段名说明
Id主键
FirstName名
LastName姓
Email邮箱
JobTitle职位

BlockedEntries表

字段名说明
Id主键
Email被封禁邮箱

需求与现有问题

需要从Contact表中找出同时满足以下两个条件的记录,并返回完整联系人详情:

  1. 邮箱存在于BlockedEntries表中
  2. 该邮箱在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表数据

IdFirstNameLastNameEmailJobTitle
12samjsamj@gmail.comengineer
23bosjbosj@gmail.comaccountnt
34casjsamj@gmail.comengineer
33xxxjbosj@gmail.comfied
55dfecdfe@gmail.comstudent

BlockedEntries表数据

IdEmailCreateDate
1samj@gmail.com09/12/2020 19:30:20
2bosj@gmail.com09/12/2020 19:30:20
3dfe@gmail.com09/12/2020 19:30:20

期望结果

EmailIdFirstNameLastNameJobTitle
samj@gmail.com12samjengineer
samj@gmail.com34casjengineer
bosj@gmail.com23bosjaccountnt
bosj@gmail.com33xxxjfied

注: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 17:35:13