mybatis复杂业务sql语句

1. IN &&NOT IN

NOT IN :

<select id="queryOtherArea" resultType="cn.com.iot.bean.bo.Area">
  SELECT  *  FROM  iot_area a
  WHERE
  a.id NOT IN
  (SELECT id FROM iot_user_area_relation  r WHERE  r.user_id=#{userId})
  <if test="pageSize!=null and pageNum!=null" >
    LIMIT #{pageNum},#{pageSize}
  </if>

IN:

<select id="countAllUsers"  resultType="int">
		SELECT count(*)
		FROM iot_user t
		LEFT JOIN   iot_role s ON t.role_id = s.id
		LEFT JOIN   iot_city n ON t.city_id = n.id
		WHERE  t.is_delete = 1 AND
		t.city_id IN
		<foreach collection="cityIds" index="index" item="var" open="(" separator="," close=")">
			#{var}
		</foreach>
		<if test="query != null and query != ''">
			AND (t.user_name LIKE #{query} or t.phone LIKE #{query} or t.real_name LIKE #{query}
			or s.role_name LIKE #{query} or n.name LIKE #{query} )
		</if>
	</select>

2.动态插入

<insert id="insertNewUser"  >
   INSERT INTO iot_user
   <trim prefix="(" suffix=")" suffixOverrides=",">
      user_name,
      real_name,
      phone,
      password,
      gender,
      create_time,
      is_delete,
      <if test="data.address!=null">
         address,
      </if>
      <if test="data.cityId!=null">
         city_id,
      </if>
   </trim>
   <trim prefix="values ("  suffix=")" suffixOverrides=",">
      #{data.userName},
      #{data.realName},
      #{data.phone},
      #{data.password},
      #{data.gender},
      NOW(),
      1,
      <if test="data.address!=null">
      #{data.address},
      </if>
      <if test="data.cityId!=null">
      #{data.cityId},
      </if>
   </trim>
</insert>

3.模糊查询

<select id="queryAreaList" resultMap="BaseResultMap">
  SELECT * FROM  iot_area
  where 1 =1
  <if test="areaName != null">
    and area_name like '%${areaName}%'
  </if>
  limit #{pageNum},#{pageSize}
</select>

4.动态修改

<update id="updateByPrimaryKeySelective" >
  update iot_area
  <set>
    <if test="areaName != null">
      area_name = #{areaName,jdbcType=VARCHAR},
    </if>
      create_time = NOW(),
    <if test="remarks != null">
      remarks = #{remarks,jdbcType=VARCHAR},
    </if>
  </set>
  where id = #{id,jdbcType=INTEGER}
</update>

5.OR查询

<select id="queryUserOrUsers" resultMap="user">
   SELECT distinct t.id as t_id,
   t.user_name as userName,
   t.password  as password,
   t.phone     as phone,
   t.address     as address,
   t.create_time as t_createTime,
   t.real_name as realName,
   t.is_delete as isDelete,
   t.role_id   as roleId,
   t.gender    as gender,
   s.id        as s_id,
   s.role_name as roleName,
   t.city_id   as cityId,
   n.name      as cityName,
   n.supper_city
   FROM iot_user t
   LEFT JOIN iot_role s ON t.role_id = s.id
   LEFT JOIN iot_city n ON t.city_id = n.id
   WHERE  t.is_delete =1
   <if test="query != null and query != ''">
      AND (t.user_name LIKE #{query} or t.phone LIKE #{query} or t.real_name LIKE #{query}
      or n.name LIKE #{query} )
   </if>
   ORDER BY t.create_time DESC
   <if test="pageNum!=null and pageSize!=null">
      LIMIT #{pageNum}, #{pageSize}
   </if>
</select>

6.批量删除

Integer deleteDeviceList(Map<String, Object> param );

<delete id="deleteDeviceList">
		UPDATE   iot_device
		SET  is_delete =2
		WHERE  id IN
		<foreach collection="list" index="index" item="var" open="(" separator="," close=")">
			#{var}
		</foreach>
	</delete>

7.查询最新数据

<select id="selectLastBydeviceId" resultType="cn.com.iot.bean.bo.DeviceHistoryState">
    SELECT  *  FROM iot_history_device_state
    WHERE  device_id =#{deviceId}
    order by id desc
    limit 1;
  </select>

8.分页

<if test="pageInfo!=null and pageInfo.pageSize!=null and pageInfo.pageNum!=null">
            limit #{pageInfo.pageNum}, #{pageInfo.pageSize}
 </if>

9.时间段查询

 <select id="selectAlarm" resultType="cn.com.iot.bean.bo.NewTargetAlarmInfo">
        SELECT
        itai.id AS  id,
        ia.area_name AS  areaName,
        ibi.business_name AS busName,
        it.iot_target_name AS targetName,
        ist.sensor_name   AS sensorTypeName,
        ita.level AS alarmLevel,
        itai.start_time AS  startTime,
        itai.pro_state AS  proState,
        itai.transactor AS transactor,
        itai.update_time AS solvedTime
        FROM  iot_target_alarm_info itai
        LEFT  JOIN  iot_device id ON  id.device_id = itai.device_id
        LEFT  JOIN iot_business_info  ibi ON  ibi.id =id.business_id
        LEFT  JOIN iot_business_type ibt ON  ibt.id=ibi.type_id
        LEFT  JOIN  iot_area ia ON  ia.id=ibi.area_id
        LEFT  JOIN  iot_target_alarm ita ON  ita.id =itai.target_alarm_id
        LEFT  JOIN  iot_target it ON  it.id =ita.target_id
        LEFT  JOIN iot_sensor_type ist ON  ist.id=it.sensor_type
        WHERE ibt.id=#{data.busTypeId}
        and itai.pro_state =#{data.proState}
        <if test="data.areaId!=null and data.areaId!='' ">
            and ia.id =#{data.areaId}
        </if>
        <if test="data.alarmLevel!=null and data.alarmLevel!='' ">
            and ita.level =#{data.alarmLevel}
        </if>
        <if test="data.startTime!=null and data.endTime!=null ">
            and itai.start_time between '${data.startTime} 00:00:00'  and  '${data.endTime} 23:59:59'
        </if>
        <if test="data.transactor!=null and data.transactor!='' ">
            and itai.transactor like "%"#{data.transactor}"%"
        </if>

    </select>

10. group by

<select id="selectBusInfoStateOfSmoke" resultType="cn.com.iot.bean.bo.ConstructionStateBO">

    SELECT
    ic.name AS constructionName,
    ic.id AS constructionId,
    ia.id AS areaId,
    ic.gps AS gps,
    count(ibi.id) AS busAmount
    FROM   iot_construction ic
    LEFT  JOIN iot_business_info ibi ON ibi.construction_id=ic.id
    LEFT  JOIN iot_business_type ibt ON ibt.id =ibi.type_id
    LEFT JOIN  iot_area ia ON ia.id=ibi.area_id
    WHERE  ibt.id=#{data.busTypeId}
    
    <if test="data.areaId != null and data.areaId!=''">
      and ia.id = #{data.areaId}
    </if>
    
    GROUP BY constructionName
  </select>

11.左连接

SELECT
    ib.area_name,
    IFNULL(ic.amount,0)
    FROM iot_area AS ib
    LEFT JOIN
    ( SELECT
    ia.area_name AS areaName,
    COUNT(ibi.id) AS amount
    FROM iot_area ia
      JOIN iot_business_info ibi ON  ibi.area_id=ia.id
      JOIN iot_business_type ibt ON  ibt.id=ibi.type_id
    WHERE ibt.id=#{data.busTypeId}
    GROUP BY areaName) ic
    ON ic.areaName=ib.area_name

12.统计今日信息

<select id="selectTodayAlarmInfo" resultType="cn.com.iot.bean.bo.TodayAlarmIno">
    SELECT
    itai.id AS id,
    itai.start_time AS  startTime,
    ita.level AS level,
    ibi.business_name AS businessName,
    concat(ist.sensor_name,'-',it.iot_target_name) AS  targetName
    FROM iot_target_alarm_info itai
    LEFT JOIN  iot_target_alarm ita ON ita.id =itai.target_alarm_id
    LEFT JOIN iot_device id ON id.device_id =itai.device_id
    LEFT JOIN  iot_business_info ibi ON ibi.id=id.business_id
    LEFT JOIN  iot_target it ON it.id =ita.target_id
    LEFT JOIN iot_sensor_type ist ON ist.id=it.sensor_type
    WHERE TO_DAYS(itai.start_time) = TO_DAYS(NOW())
    AND itai.pro_state=0
    ORDER BY startTime ASC
  </select>

13.查询近7天数量统计,没有的显示为0

TO_DAYS:用来规范日期格式,很重要,要不然group by 的时候日期统计会错误
查询近7天数量统计用的是日进行分组,还可以用周和月:

		SELECT DATE_FORMAT(create_time,'%Y-%m-%d') days FROM role GROUP BY days;   
		SELECT DATE_FORMAT(create_time,'%Y-%u') weeks FROM role GROUP BY weeks; 
        SELECT DATE_FORMAT(create_time,'%Y-%m') months FROM role GROUP BY months;
SELECT aa.click_date,
  IFNULL(bb.amount,0)	
  FROM 
 (   
SELECT CURDATE() AS click_date
UNION ALL
SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY) AS click_date
UNION ALL
SELECT DATE_SUB(CURDATE(), INTERVAL 2 DAY) AS click_date
UNION ALL
SELECT DATE_SUB(CURDATE(), INTERVAL 3 DAY) AS click_date
UNION ALL
SELECT DATE_SUB(CURDATE(), INTERVAL 4 DAY) AS click_date
UNION ALL
SELECT DATE_SUB(CURDATE(), INTERVAL 5 DAY) AS click_date
UNION ALL
SELECT DATE_SUB(CURDATE(), INTERVAL 6 DAY) AS click_date
UNION ALL
SELECT DATE_SUB(CURDATE(), INTERVAL 7 DAY) AS click_date

) AS aa
LEFT JOIN 
(
SELECT 
COUNT(id) AS amount, 
DATE_FORMAT(start_time,'%Y-%m-%d') AS click_date
FROM iot_target_alarm_info
WHERE start_time>=DATE(NOW())-INTERVAL 7 DAY
GROUP BY TO_DAYS(start_time)
) AS bb
ON aa.click_date=bb.click_date

14.百分比

<select id="queryBusTypePercentage" resultType="java.util.Map">

        SELECT aa.id as busTypeId,
		IFNULL(bb.percentage,0) AS percentage,
		bb.count as count

         FROM  iot_business_type aa
         LEFT JOIN
         (
          SELECT
        ibt.id AS id,
        concat(ROUND(COUNT(itai.id)/${data.alarmAmount}*100,1),'%') AS percentage,
        COUNT(itai.id) AS count
        FROM iot_target_alarm_info itai
        LEFT JOIN iot_device id ON id.device_id =itai.device_id
        LEFT JOIN  iot_business_info ibi ON ibi.id=id.business_id
        LEFT JOIN iot_business_type ibt ON  ibt.id=ibi.type_id
        LEFT JOIN  iot_area ia ON ia.id=ibi.area_id
        WHERE
         ia.id IN (
            SELECT  iuar.area_id FROM  iot_user_area_relation iuar
             WHERE iuar.user_id =#{data.userId}
	    )
	    AND  itai.pro_state=0
	    GROUP BY ibt.id
	   ) bb
	   ON aa.id=bb.id
    </select>


15. group by嵌套

SELECT 
       aa.id AS busTypeId,
       IFNULL(cc.count,0) AS count   
       FROM iot_business_type aa
       LEFT JOIN
	 (
         
       SELECT   
		bb.busTypeId,
		COUNT(bb.busId) AS count
       FROM         
        (        
       SELECT 
	      ibi.id AS busId,
	      ibt.id AS busTypeId
             FROM   iot_business_info ibi
        LEFT JOIN iot_device id ON id.business_id=ibi.id
        LEFT JOIN iot_business_type ibt  ON  ibt.id=ibi.type_id
        LEFT JOIN  iot_area ia           ON ia.id=ibi.area_id
        LEFT JOIN iot_target_alarm_info itai ON id.device_id =itai.device_id
        WHERE ibi.state =0
        AND ia.id IN (
            SELECT  iuar.area_id FROM  iot_user_area_relation iuar
            WHERE iuar.user_id =#{data.userId}
            )
       GROUP BY ibi.id
       ) bb
       GROUP BY bb.busTypeId
       )cc
       ON aa.id =cc.busTypeId
  1. group by 多个字段
SELECT
       aa.id AS busTypeId,
       IFNULL(cc.count,0) AS COUNT,
       cc.state AS state

       FROM iot_business_type aa
       LEFT JOIN
	 (
       SELECT
		bb.busTypeId,
		COUNT(bb.busId) AS COUNT,
		bb.state AS state
       FROM
        (
         
       SELECT
	      ibi.id AS busId,
	      ibt.id AS busTypeId,
	      ibi.state AS state
             FROM   iot_business_info ibi
        LEFT JOIN iot_business_type ibt  ON  ibt.id=ibi.type_id
        LEFT JOIN  iot_area ia           ON ia.id=ibi.area_id
       GROUP BY ibi.id
       ) bb
       GROUP BY bb.busTypeId,bb.state
       )cc
       ON aa.id =cc.busTypeId

17.SUM函数

SELECT 
	SUM(idtis.addWater) AS water,
        DATE_FORMAT(creat_time,'%Y-%m-%d') AS creatTime 
        FROM iot_device_target_info_shuibiao idtis
        LEFT JOIN iot_device id 	ON id.device_id=idtis.device_id
        LEFT JOIN iot_business_info ibi ON  id.business_id=ibi.id 
        LEFT JOIN iot_business_type ibt  ON  ibt.id=ibi.type_id
        LEFT JOIN  iot_area ia           ON ia.id=ibi.area_id
        LEFT JOIN  iot_construction ic          ON ic.id=ibi.construction_id
        WHERE ia.id IN (
                    SELECT  iuar.area_id FROM  iot_user_area_relation iuar
                    WHERE iuar.user_id =17
                    )

        GROUP BY TO_DAYS(idtis.creat_time)  

16.表名为参数

<select id="findNewTarget"  resultMap="TargetData">
        SELECT *
        FROM
        iot_target_info_${targetName} tit
        WHERE  tit.business_id = #{id}
        ORDER BY tit.create_time DESC LIMIT 1
    </select>

17.按照月份进行分组,没有显示为0

SELECT tDate.click_date,
  IFNULL(tWater.water,0)  
  FROM 
  (   
  SELECT  DATE_FORMAT(CURDATE(), '20%y-%m') AS click_date
  UNION ALL
  SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '20%y-%m') AS click_date
  UNION ALL
  SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 2 MONTH), '20%y-%m') AS click_date
  UNION ALL
  SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 3 MONTH), '20%y-%m') AS click_date
  UNION ALL
  SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 4 MONTH), '20%y-%m') AS click_date
  UNION ALL
  SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 5 MONTH), '20%y-%m') AS click_date
  UNION ALL
  SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 6 MONTH), '20%y-%m') AS click_date
  UNION ALL
  SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 7 MONTH), '20%y-%m') AS click_date
  UNION ALL
  SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 8 MONTH), '20%y-%m') AS click_date
  UNION ALL
  SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 9 MONTH), '20%y-%m') AS click_date
  UNION ALL
  SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 10 MONTH), '20%y-%m') AS click_date
  UNION ALL
  SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 11 MONTH), '20%y-%m') AS click_date
  UNION ALL
  SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 12 MONTH), '20%y-%m') AS click_date
   ) tDate
  LEFT JOIN 
  (           
        SELECT 
        SUM(idtis.addWater) AS water,
        DATE_FORMAT(creat_time,'%Y-%m') months
        FROM iot_device_target_info_shuibiao idtis
        LEFT JOIN iot_device id   ON id.device_id=idtis.device_id
        LEFT JOIN iot_business_info ibi ON  id.business_id=ibi.id 
        LEFT JOIN iot_business_type ibt  ON  ibt.id=ibi.type_id
        LEFT JOIN  iot_area ia           ON ia.id=ibi.area_id
        LEFT JOIN  iot_construction ic      ON ic.id=ibi.construction_id
        WHERE ia.id IN (
                    SELECT  iuar.area_id FROM  iot_user_area_relation iuar
                    WHERE iuar.user_id =17
                    )
	AND ic.id=1
        GROUP BY months
        ) tWater
        ON   tDate.click_date= tWater.months    
  1. 少量用表别名
<select id="selectDevicelist" resultMap="device">
		SELECT
		aa.id AS t_id,
		aa.device_id AS t_device_id,
		aa.device_name AS t_device_name,
		aa.location AS t_location,
		aa.manufacturer AS t_manufacturer,
		aa.manufacturer_date AS t_manufacturer_date,
		aa.sensor_type_id AS t_sensor_type_id,
		aa.sensor_type_name AS t_sensor_type_name,
		aa.version AS t_version,
		aa.create_time AS t_create_time,
		aa.type_id AS t_type_id,
		aa.access_name AS t_access_name,
		aa.status  AS t_status,
		ibi.business_name AS x_business_name,
		ibi.id as x_id
		FROM
		(
		SELECT
		id.id ,
		id.`device_id`,
		id.`business_id` ,
		id.`device_name` ,
		id.`location` ,
		id.`manufacturer` ,
		id.`manufacturer_date` ,
		id.`sensor_type_id` ,
		id.`sensor_type_name`  ,
		id.`version` ,
		id.create_time ,
		id.`type_id`  ,
		id.`access_name` ,
		id.`status` 
		FROM iot_device id
		WHERE id.`sensor_type_id` IN(
		SELECT ibsr.sensortype_id
		FROM iot_bustype_sensortype_relation ibsr
		WHERE ibsr.bustype_id=#{busTypeId}
		)
		AND id.is_delete =1
		)aa
		LEFT JOIN iot_business_info ibi  ON ibi.id =aa.business_id
		where 1=1
		<if test="busName != null and busName!=''">
			and ibi.business_name LIKE "%"#{busName}"%"
		</if>
		<if test="devName != null and devName!=''">
			and aa.device_name LIKE  "%"#{devName}"%"
		</if>
		<if test="sensorName != null and sensorName!=''">
			and aa.sensor_type_name = #{sensorName,jdbcType=VARCHAR}
		</if>
		<if test="status != null and status!=''">
			and aa.status = #{status,jdbcType=VARCHAR}
		</if>

		ORDER BY aa.create_time DESC limit #{pageNum},#{pageSize}
	</select>
  1. union结果集
<select id="selectBusiness" resultType="cn.com.iot.bean.bo.BusinessInfoBO">

		SELECT  id,business_name
		FROM iot_business_info
		WHERE  id
		NOT  IN (
		SELECT business_id FROM  iot_device
		WHERE is_delete =1)
		<if test="data!=null and data.busId !=null and data.busId !=''">
			UNION
			SELECT id,business_name FROM iot_business_info WHERE  id=#{data.busId}
		</if>
</select>
  1. 一对多select嵌套
<select id="selectSensorType" resultType="cn.com.iot.bean.bo.SensorType">
		SELECT  id,sensor_name FROM iot_sensor_type ist
		WHERE ist.id IN
		(SELECT sensortype_id FROM iot_bustype_sensortype_relation WHERE bustype_id
		=( SELECT type_id FROM iot_business_info WHERE  id=#{data.busId}
		)
		)
	</select>

猜你喜欢

转载自blog.csdn.net/reee112/article/details/83304279