如何在MySQL中筛选同一a值下sa和mo行f列不同的数据
解决MySQL筛选同一a值下sa和mo行f值不同的记录问题
我是SQL新手,现有一个MySQL表,数据如下:
| a | b | c | d | e | f |
|---|---|---|---|---|---|
| abra | ca | da | bra | sa | 7 |
| abra | fa | ll | of | mo | 8 |
| ac | st | da | bra | sa | 10 |
| ac | ca | da | bra | mo | 9 |
| pa | ni | rar | pat | sa | 11 |
| pa | pu | bra | sa | mo | 11 |
表中e列的值仅为sa或mo,每个a值对应至少一行sa和一行mo的记录。我需要获取所有满足以下条件的行:同一a值对应的sa行和mo行的f列值不同。示例中最后两行因f列均为11会被过滤,返回结果如下:
| a | b | c | d | e | f |
|---|---|---|---|---|---|
| abra | ca | da | bra | sa | 7 |
| abra | fa | ll | of | mo | 8 |
| ac | st | da | bra | sa | 10 |
| ac | ca | da | bra | mo | 9 |
我尝试了以下查询语句,但未得到正确结果:
select * from table t1 where exists (select 1 from table t2 where t1.a <> '' and t2.a <> '' and t1.a=t2.a and (t2.e='sa' or t2.e='mo') and t1.e=t2.e and t1.f<>t2.f) order by a
正确的查询方法
方法一:分组筛选符合条件的a值再关联原表
先通过分组统计,找出同一a值下sa和mo对应的f值存在差异的a,再关联原表获取完整行数据:
SELECT t.* FROM your_table t JOIN ( SELECT a FROM your_table WHERE e IN ('sa', 'mo') GROUP BY a HAVING COUNT(DISTINCT f) > 1 ) AS valid_a ON t.a = valid_a.a WHERE t.e IN ('sa', 'mo') ORDER BY t.a;
方法二:自连接对比sa和mo的f值
通过自连接直接匹配同一a下sa和mo行的f值差异,再通过UNION合并两类行:
SELECT t1.* FROM your_table t1 JOIN your_table t2 ON t1.a = t2.a AND t1.e = 'sa' AND t2.e = 'mo' AND t1.f <> t2.f UNION SELECT t2.* FROM your_table t1 JOIN your_table t2 ON t1.a = t2.a AND t1.e = 'sa' AND t2.e = 'mo' AND t1.f <> t2.f ORDER BY a;
原查询的问题分析
你原来的EXISTS子查询逻辑偏离需求:它在找同一a、同一e下f值不同的行,但实际需求是**同一a、不同e(sa和mo)**下的f值不同,因此无法得到正确结果。
内容的提问来源于stack exchange,提问作者user2175783
相关产品推荐
相关产品推荐

