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
- 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
- 少量用表别名
<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>
- 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>
- 一对多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>