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

MySQL技术问询:如何筛选存在多操作及同时含unsub和open的email_id

嘿,这个需求其实挺常见的,我来给你几种靠谱的SQL写法,不管是找存在多种操作的email_id,还是精准筛选同时有unsub和open的,都能搞定👇

一、查询存在多种操作的email_id(通用场景)

如果只是想找出所有有至少两种不同操作的email_id,用分组统计的方式最直接:

SELECT email_id
FROM your_table_name
GROUP BY email_id
HAVING COUNT(DISTINCT action) >= 2;

这里的COUNT(DISTINCT action)是统计该email_id对应的不同操作类型数量,大于等于2就说明有多种操作。如果你的表不会重复记录同一个email_id的同一种操作(比如不会多次记录同一个邮件的open行为),可以去掉DISTINCT,用COUNT(action) >= 2,但加DISTINCT会更严谨,避免重复数据干扰结果。

二、精准筛选同时包含unsub和open的email_id

如果是要精确找出同时有这两种操作的email_id,有几种不同的实现方式,你可以根据表的数据量和结构选最顺手的:

方式1:子查询+IN

这种写法逻辑直观,容易理解:

SELECT DISTINCT email_id
FROM your_table_name
WHERE action = 'open'
AND email_id IN (
    SELECT email_id
    FROM your_table_name
    WHERE action = 'unsub'
);

先找出所有有unsub操作的email_id集合,再筛选出同时存在open操作的email_id,最后用DISTINCT去重(避免同一个email_id有多个open记录导致重复结果)。

方式2:分组+HAVING精准匹配

这种方法效率不错,先缩小数据范围再统计:

SELECT email_id
FROM your_table_name
WHERE action IN ('open', 'unsub') -- 先过滤掉无关操作的记录
GROUP BY email_id
HAVING COUNT(DISTINCT action) = 2; -- 确保两种操作都存在

先把范围限定在open和unsub的记录里,分组后统计不同操作数等于2,就说明这个email_id同时有两种操作。

方式3:自连接查询

用表自连接的方式匹配两种操作:

SELECT DISTINCT t1.email_id
FROM your_table_name t1
JOIN your_table_name t2
ON t1.email_id = t2.email_id
WHERE t1.action = 'open' AND t2.action = 'unsub';

把表拆成两个逻辑表,t1对应open操作的记录,t2对应unsub操作的记录,通过email_id关联起来,最后去重得到结果。

💡 小提示:如果你的表数据量很大,记得给email_id和action字段加上索引,能大幅提升这些查询的速度哦!

内容的提问来源于stack exchange,提问作者Bruce Yan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:59:36