mybatis 实现将查询条件写入查询结果中

发布时间 2023-03-29 17:35:06作者: 泄,bro

需求分析

    近日,接到一需求,需要将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