MySQL多字段去重问题:筛选userid/object为1且无重复数据
解决方案
先拆解需求核心逻辑:先筛选userId=1或object=1的记录并去重,再按两个互斥规则过滤:
- 若存在
userId=1且object=2的记录,剔除userId=2且object=1的记录 - 若存在
userId=2且object=1的记录,剔除userId=1且object=1的记录
可以用CTE(公共表表达式)分步实现,SQL语句如下:
WITH deduplicated AS ( -- 第一步:筛选符合基础条件的记录并去重 SELECT DISTINCT userId, object FROM userChat WHERE userId = 1 OR object = 1 ), condition_check AS ( -- 第二步:检查触发排除规则的关键记录是否存在 SELECT EXISTS(SELECT 1 FROM deduplicated WHERE userId=1 AND object=2) AS has_user1_obj2, EXISTS(SELECT 1 FROM deduplicated WHERE userId=2 AND object=1) AS has_user2_obj1 ) -- 第三步:根据检查结果应用排除规则,输出最终数据 SELECT d.userId, d.object FROM deduplicated d CROSS JOIN condition_check c WHERE NOT (c.has_user1_obj2 AND d.userId=2 AND d.object=1) AND NOT (c.has_user2_obj1 AND d.userId=1 AND d.object=1);
逻辑说明
deduplicated先提取满足基础条件的去重记录,作为候选数据集condition_check提前判断两个关键触发记录是否存在,避免重复查询- 最后通过WHERE条件,根据判断结果精准剔除不符合规则的记录,得到预期的3条不重复数据
内容的提问来源于stack exchange,提问作者inkyart
相关产品推荐
相关产品推荐

