MySQL技术问询:如何筛选存在多操作及同时含unsub和open的email_id
嘿,这个需求其实挺常见的,我来给你几种靠谱的SQL写法,不管是找存在多种操作的email_id,还是精准筛选同时有unsub和open的,都能搞定👇
如果只是想找出所有有至少两种不同操作的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会更严谨,避免重复数据干扰结果。
如果是要精确找出同时有这两种操作的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

