1
SELECTA.*
FROM(SELECTA.project_id,COALESCE ( A.category_id, '0' ) category_id,( -- 其它没有查询的分类, 就会是null, 所以会归为其它CASEWHEN COALESCE ( A.category_name, '其他分类' ) = '其他分类' THEN '其他' WHEN COALESCE ( A.category_name, '其他分类' ) = '强电系统' THEN '供配电' WHEN COALESCE ( A.category_name, '其他分类' ) = '电梯升降系统' THEN '升降设备' WHEN COALESCE ( A.category_name, '其他分类' ) = '暖通空调系统' THEN '暖通空调' WHEN COALESCE ( A.category_name, '其他分类' ) = '消防系统' THEN '消防' WHEN COALESCE ( A.category_name, '其他分类' ) = '视频监控系统' THEN '视频监控' WHEN COALESCE ( A.category_name, '其他分类' ) = '出入口门禁控制系统' THEN '门禁停车' WHEN COALESCE ( A.category_name, '其他分类' ) = '停车场管理系统' THEN '门禁停车' WHEN COALESCE ( A.category_name, '其他分类' ) = '动环监测系统' THEN '动环设备' END ) category_name,COUNT( A.ID ) COUNT,COUNT( CASE WHEN A.use_status IN ( '0', '2', '4', '5' ) THEN 1 END ) AS enable_count,COUNT( CASE WHEN A.use_status IN ( '0', '2', '4', '5' ) AND A.COUNT > 0 THEN 1 END ) AS enable_iot_count FROM(SELECTA.project_id,A.ID,A.use_status,b.ID category_id,b.category_name,COUNT( CASE WHEN C.business_type IN ( '0', '1' ) THEN 1 END ) COUNTFROMfacility_ledger ALEFT JOIN (-- 至此, 得到所有所要查询的分类下的所有分类idSELECTA.ID,A.category_name,string_agg ( f.ID, ',' ) stringAggId,A.project_id FROMfacility_category f -- 分类与分类之间存在父子级关系, 难点在于下面想要查询的分类也可能存在父子级关系, -- 也就是说: 1个设备可能属于某2个分类, 并且这2个分类存在父子级关系, -- 比如说: 子级分类的设备肯定属于该子级的父级分类-- 也就说: 这里要考虑设备在这2个分类中要被计算2次的情况LEFT JOIN ( -- 这里找出想要查询的分类SELECTID,route_id,category_name,project_id FROMfacility_category WHEREdelete_flag = 0 AND category_name IN ( '强电系统', '电梯升降系统', '暖通空调系统', '消防系统', '视频监控系统', '出入口门禁控制系统', '动环监测系统', '停车场管理系统' )) A ON A.project_id = f.project_id AND f.route_id LIKE concat ( '%', A.route_id, '%' ) WHEREf.delete_flag = 0 AND A.route_id IS NOT NULL GROUP BYA.project_id,A.ID,A.category_name ) b ON A.project_id :: INTEGER = b.project_id AND b.stringAggId LIKE concat ( '%', A.classification_id, '%' )LEFT JOIN facility_iot C ON A.ID = C.facility_id AND C.delete_flag = 0 WHEREA.delete_flag = 0 AND b.ID IS NOT NULLAND C.id IS NOT NULL GROUP BYA.project_id,A.ID,b.ID b.category_name,ORDER BYCOUNT DESC ) A GROUP BY A.project_id, A.category_id,A.category_name ORDER BY COUNT DESC ) A
2
SELECTproject_id,category_id,category_name,sum( count ) count
FROM(SELECT -- 对 项目id、设备分类id、设备分类名称 分组 统计dd.project_id,COALESCE ( dd.category_id, '0' ) AS category_id,(CASEWHEN COALESCE ( dd.category_name, '其他分类' ) = '其他分类' THEN '其他' WHEN COALESCE ( dd.category_name, '其他分类' ) = '强电系统' THEN '供配电' WHEN COALESCE ( dd.category_name, '其他分类' ) = '电梯升降系统' THEN '升降设备' WHEN COALESCE ( dd.category_name, '其他分类' ) = '暖通空调系统' THEN '暖通空调' WHEN COALESCE ( dd.category_name, '其他分类' ) = '消防系统' THEN '消防' WHEN COALESCE ( dd.category_name, '其他分类' ) = '视频监控系统' THEN '视频监控' WHEN COALESCE ( dd.category_name, '其他分类' ) = '出入口门禁控制系统' THEN '门禁停车' WHEN COALESCE ( dd.category_name, '其他分类' ) = '停车场管理系统' THEN '门禁停车' WHEN COALESCE ( dd.category_name, '其他分类' ) = '动环监测系统' THEN '动环设备' END) AS category_name,COUNT(*) AS count FROM(SELECTA.project_id,COALESCE ( B.ID, '0' ) AS category_id, -- 每个告警 不属于 指定名称分类时, 指定其分类id为0, 与此同时它的B.categoryName会是nullB.category_name FROM( -- 查询 每个告警 对应具体的 设备分类SELECTfai.project_id,fai.ID,fl.classification_id FROMfacility_alarm_info faiLEFT JOIN facility_ledger fl ON fl.ID = fai.facility_id WHEREfai.alarm_status = '1' fai.modify_time >= CURRENT_DATE AND fai.modify_time < DATE_ADD( CURRENT_DATE, INTERVAL 1 DAY )) ALEFT JOIN ( -- 查询指定设备分类名称 的 设备分类 下的所有设备分类, 并让它们使用逗号拼接;-- 查询指定设备分类名称 的 设备分类 之间可能会存在父子级关系;-- 不同项目的相同设备分类名称的设备分类id一定是不同的;SELECTAA.ID,AA.category_name,GROUP_CONCAT( f.ID SEPARATOR ',' ) AS stringAggId FROMfacility_category fLEFT JOIN ( -- 查询指定设备分类名称 的 设备分类SELECTID,route_id,category_name FROMfacility_category WHEREcategory_name IN ( '强电系统', '电梯升降系统', '暖通空调系统', '消防系统', '视频监控系统', '出入口门禁控制系统', '动环监测系统', '停车场管理系统' ) AND project_id = '1') AA ON f.route_id LIKE CONCAT( '%', AA.route_id, '%' ) WHEREf.delete_flag = 0 AND AA.route_id IS NOT NULL GROUP BYAA.ID,AA.category_name ) B ON FIND_IN_SET( A.classification_id, B.stringAggId ) -- 每个告警 对应的设备分类 并且 对应的设备分类的父级分类上) dd WHEREdd.project_id = '1'GROUP BYdd.project_id,dd.category_id,dd.category_name ) a
GROUP BYcategory_name
3
SELECTt1.id buildingId,t2.building_name,count(*) alarmCount
FROM(SELECTbu.id building_id,fai.idFROMboard_info_rule_rel birr -- 1个board_info_id 订阅多个 alarm_rule_idLEFT JOIN board_info bi ON birr.board_info_id = bi.ID -- board_info记录了 看板的属性 和 设备id列表-- 应该还需要对fai的id进行分组才行LEFT JOIN facility_alarm_info fai ON birr.alarm_rule_id = fai.rule_id AND FIND_IN_SET( fai.facility_id, bi.facility_scope )LEFT JOIN alarm_rule ar ON birr.alarm_rule_id = ar.ID AND FIND_IN_SET( fai.facility_id, ar.alarm_facility ) -- 除了要在看板允许的设备范围内, 还要属于告警规则的设备范围内LEFT JOIN facility_ledger fl ON fai.facility_id = fl.idLEFT JOIN resource_manage.building bu ON bu.id = fl.position_idWHEREar.delete_flag = 0AND bi.standard_board = '1'AND bi.delete_flag = 0AND bi.STATUS = '1'AND fai.project_id = #{projectId}AND DATE( fai.alarm_time ) = CURDATE()AND fl.position_type = '3' UNION ALLSELECTbf.building_id,fai.idFROMboard_info_rule_rel birrLEFT JOIN board_info bi ON birr.board_info_id = bi.IDLEFT JOIN facility_alarm_info fai ON birr.alarm_rule_id = fai.rule_id AND FIND_IN_SET( fai.facility_id, bi.facility_scope )LEFT JOIN alarm_rule ar ON birr.alarm_rule_id = ar.ID AND FIND_IN_SET( fai.facility_id, ar.alarm_facility )LEFT JOIN facility_ledger fl ON fai.facility_id = fl.idLEFT JOIN resource_manage.building_floor bf ON bf.id = fl.position_idWHEREar.delete_flag = 0AND bi.standard_board = '1'AND bi.delete_flag = 0AND bi.STATUS = '1'AND fai.project_id = #{projectId}AND DATE( fai.alarm_time ) = CURDATE()AND fl.position_type = '4' UNION ALLSELECTbfr.building_id,fai.idFROMboard_info_rule_rel birrLEFT JOIN board_info bi ON birr.board_info_id = bi.IDLEFT JOIN facility_alarm_info fai ON birr.alarm_rule_id = fai.rule_id AND FIND_IN_SET( fai.facility_id, bi.facility_scope )LEFT JOIN alarm_rule ar ON birr.alarm_rule_id = ar.ID AND FIND_IN_SET( fai.facility_id, ar.alarm_facility )LEFT JOIN facility_ledger fl ON fai.facility_id = fl.idLEFT JOIN resource_manage.building_floor_room bfr ON bfr.id = fl.position_idWHEREar.delete_flag = 0AND bi.standard_board = '1'AND bi.delete_flag = 0AND bi.STATUS = '1'AND fai.project_id = #{projectId}AND DATE( fai.alarm_time ) = CURDATE()AND fl.position_type = '5') t1LEFT JOIN resource_manage.building t2 ON t1.building_id = t2.id
GROUP BYt1.building_id,t2.building_name
4
trim标签与OR结合使用&group_concat新用法
<select id="listFacilityLedgerInMapper"resultType="com.infipark.facility.application.dto.FacilityLedgerExtendDTO">SELECTfl.id,fl.facility_name,fl.project_id,fl.classification_id,fl.classification_code, GROUP_CONCAT(fs.specs_name,":",fs.specs_value order by fs.create_time,fs.id SEPARATOR ';')AS specsGroupfrom facility_ledger flleft join facility_specs fs on fl.id = fs.facility_id and fs.delete_flag = 0<where>fl.project_id = #{param.projectId}AND fl.delete_flag = 0<if test="param.ids != null and param.ids.size() > 0">AND fl.id IN<foreach collection="param.ids" item="id" open="(" close=")" separator=",">#{id}</foreach></if><if test="param.specsIds != null and param.specsIds.size() > 0">AND fl.id IN<foreach collection="param.specsIds" item="id" open="(" close=")" separator=",">#{id}</foreach></if><if test="param.nameKey != null and param.nameKey != ''">AND (fl.facility_name LIKE CONCAT('%',#{param.nameKey},'%')OR fl.classification_code LIKE CONCAT('%',#{param.nameKey},'%')OR fl.position_details LIKE CONCAT('%',#{param.nameKey},'%'))</if><if test="positions != null and positions.size() > 0">AND (<trim prefixOverrides="OR"><foreach collection="positions" item="position" open=" " close=" " separator=" ">OR position_id = '${position[0]}' AND position_type = '${position[1]}'</foreach></trim>)</if></where>group by fl.id
</select>
5
<update id="batchUpdateFacilitySpecs" parameterType="java.util.List"><foreach collection="list" item="item" index="index" separator=";">UPDATE facility_specsSETspecs_value =<choose><when test="item.specsValue != null">#{item.specsValue}</when><otherwise>null</otherwise></choose>,specs_name =<choose><when test="item.specsName != null">#{item.specsName}</when><otherwise>specs_name</otherwise></choose>,create_time = create_timeWHERE id = #{item.id}</foreach></update>