查询 - 07 - sql中字符串使用in

文章讨论了如何通过员工ID查询其所属的作业单位及其实施工程的区域详情,提出了两种方法:一种是构造字符串进行IN查询,另一种是使用内连接但效率较低。作者强调了避免子链接临时表以提高查询性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

in的一次新奇使用

问题描述:
这是个先有表,后查询的问题,表的设计不止下面的一种

某地 area_id,有多个作业单位 work_comp 实施工程,一地有多个作业单位,一个作业单位可以在多地实施工程

作业单位下的作业人员 work_operator 有两类,领导和普通员工,每位领导管理一个作业区域,每个作业区域有多为员工(领导 + 普通员工)

当我们想通过某个员工,查询该员工所属公司的作业区域详情
提示:work_comp 和 area_id 拼起来之后,就是一个唯一的数据了
如何实现呢?

当前表设计如下:

作业员工表 work_operator :id,work_comp,area_id,type
作业区域表 work_area_info :id,work_comp,area_id,leader,work_op(JSON字段,存普通员工的 id )


思考时间~~~


个人做法:

1. 第一步,找到目标 work_comp,area_id

先查出某员工的 work_comp,area_id,构造一个 String = work_comp + ‘-’ + area_id,将其转换为一个 String 字符串,eg:11-99

2. 第二步,使用 IN 查询当前表 work_comp + ‘-’ + area_id在不在上面的String里

开始查找区域表里的数据,使用 IN 来查询,区域表构建 String = work_comp + ‘-’ + area_id,看看区域表String是不是 IN 人员表的String
在这里,选中多个员工的 id,查询并构建出一个去重后的 list<员工>,最后开始查询

	    <resultMap id="WorkAreaInfoDOMap" type="com.justai.icp.smartcity.entity.workarea.WorkAreaInfoDO">
        	<id column="id" property="id" />
        	<result column="area_id" property="areaId" />
        	<result column="workComp" property="work_comp" />
        	<result column="operatorOwner" property="operator_owner" />
        	<result column="operators" property="operators" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
    	</resultMap>
    
	    <select id="selectByOperatorIds" resultMap="WorkAreaInfoDOMap">
        select * from work_area_info wai
        where concat(wai.area_id, '-', wai.work_comp)
        in
        <foreach item="item" index="index" collection="workOperators" open="(" separator="," close=")">
            concat(#{item.areaId},'-', #{item.workComp})
        </foreach>
    </select>

  • 给出第一版的写法,使用了内连接,可惜只能筛出一个员工,不太推荐,而且不推荐使用子链接构成的临时表,因为临时表没法走索引,查询效率很低
    <select id="selectByOperatorId" resultMap="WorkAreaInfoDOMap">
        select
            wai.id id ,
            wai.area_id area_id,
            wai.operator_owner operator_owner,
            wai.operators operators,
            wai.operator_owner_name operator_owner_name
        from work_area_info wai
                 inner join
             (SELECT woo.work_comp, woo.area_id FROM work_operator woo
              where woo.status = 1 and woo.id = #{operator_id}) as temp
             on wai.work_comp = temp.work_comp and temp.area_id = wai.area_id
    </select>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值