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>