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可以展示其他字段

经验分享 程序员 微信小程序 职场和发展