需求分析
近日,接到一需求,需要将HR 拨出号码 数据作为条件,查询是否与 每日HR上传至 人才库 的
简历电话号码匹配,用以直观的看到HR的工作效率。
简单分析过后发现该需求有两个难点
1.如何将前端传回的 phones 数据作为查询条件的同时可以展示到查询结果中
2.如何保证排序( 实际查询结果中发现,left join有数据的查询结果总是会被置顶 )
解决方法
1.sql 的 select 可以指定常量,包括对象里面的数据。根据 mybatis 语法可以直接 'select #{字段名1} as amount,#{字段名2} as store_code' 就可以转换这个对象,
MySQL中 'UNION' 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据.
2.由于 'UNION' 操作符会删除重复数据,带来了一个新的问题,传入的查询数据有可能有重复的拨号,并且我们需要按照查询条件的顺序排序。
该问题可以通过 'mybatis' 的 '<foreach>' 解决.排序则可以通过将'index' 也查询出来,最后 'order by'即可
实例展示
点击查看代码
SELECT
ab.phone,
IF
( m.phone is null, '否', '是' ) AS isMatching,
u.nick_name AS nickName,
m.create_time AS createDate
FROM
(
<foreach collection="phone" item="item" index="index" separator="union">
SELECT #{item} as phone,#{index} as id
</foreach>
) ab
LEFT JOIN (select phone,create_by,create_time,create_by_id from target where create_time between date_format(#{startTime},'%y-%m-%d 00:00:00') and date_format(#{endTime},'%y-%m-%d 23:59:59') group by phone) m ON m.phone = ab.phone
LEFT JOIN user u ON u.user_id = m.create_by_id
order by ab.id