mysql查询两个字段值相同的记录

 已知,客户在投保之前和投保之后在applicant表记录了对应的两条数据,表结构如上所示。

id是投保单id,投保前后的两条数据一定一致,applicant_id是投保人id,有可能存在不一致的情况,投保前后对应oldnew字段存储的状态分别为1和2。

现要将数据区分:

1.统计数据前后applicant_id字段未发生改变的数据,将对应数据展示

2.统计数据前后applicant_id字段发生了改变的数据,并对数据进行拼接

1.分析可知其实就是要得到applicant_id和id两个字段相同的数据

sql语句:

select id,applicant_id,applicant_name,oldnew
from applicant a
group by id,applicant_id
having count(*)=2 

其中group by id,applicant_id 意味着 id和applicant_id都要一致才能分为一组会得到以下结果

having条件针对的是已经分组之后的一个个组合对象,比如上图其实就是分为五组,其中id=2的那组中有两条数据,count(*)针对的是组合对象,id=2对应的值为count(*)=2,得到以下结果

 2.统计数据前后applicant_id字段发生了改变的数据,并对数据进行拼接

sql语句:

select a.id 投保前id,a.applicant_id 投保前applicantid,b.id 投保后id,b.applicant_id 投保后applicantid
from applicant a ,applicant b
where a.id=b.id and a.oldnew=1 and b.oldnew=2
group by a.id,a.applicant_id
having count(*)=1 
and a.id in
 (select c.id
from applicant c
group by c.id
having count(*)=2)

其中

from applicant a ,applicant b  是为了一个表当两个表来查询,可以将两条数据拼接展示

a.oldnew=1 and b.oldnew=2 条件约束使得查询出来的语句只有一条

group by a.id,a.applicant_id
having count(*)=1                是为了校验applicant_id是否不一致,就会分成两组

select c.id  from applicant c
group by c.id   having count(*)=2   是为了保证一定要是id相同的数据

group by分组一般只展示分组的字段,mysql8.0可以展示其他字段

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值