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>