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

如何在MySQL中筛选同一a值下sa和mo行f列不同的数据

解决MySQL筛选同一a值下sa和mo行f值不同的记录问题

我是SQL新手,现有一个MySQL表,数据如下:

abcdef
abracadabrasa7
abrafallofmo8
acstdabrasa10
accadabramo9
panirarpatsa11
papubrasamo11

表中e列的值仅为sa或mo,每个a值对应至少一行sa和一行mo的记录。我需要获取所有满足以下条件的行:同一a值对应的sa行和mo行的f列值不同。示例中最后两行因f列均为11会被过滤,返回结果如下:

abcdef
abracadabrasa7
abrafallofmo8
acstdabrasa10
accadabramo9

我尝试了以下查询语句,但未得到正确结果:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 12:04:56