场景:由于一个摄像头管理一个范围,且管理的某个人可以多次犯规。故,一个摄像头可以上报有多个事件,多个事件可能同时上报,可能有先后顺序。
需求:现地图只显示有事件摄像头的最新一条事件信息,故,需要ID倒序后,以摄像头分组,以此获得摄像头最新的一条事件信息。(这里以ID倒序而不以创建时间倒序,是有一定优势的)。
思路:先ID(时间)倒序,后分组。
说明: 如果是单表查询,默认分组后是ID最大的一条数据,若是连表查询,需要以下方法处理。
SELECT t.id,t.camera_id,t.create_time FROM
(SELECT e.* FROM sys_enforce_event e LEFT JOIN sys_dict_node n ON e.node_id = n.id
WHERE e.is_deleted = 0 AND e.source_id = 2 AND n.`code` IN (200,301,302,400,500) AND e.camera_id IS NOT NULL ORDER BY e.id DESC ) t
GROUP BY t.camera_id
以下方式就不对了,查找的不是最新一条记录(连表查询,看清区别)
SELECT e.* (SELECT * FROM sys_enforce_event ORDER BY id DESC ) e LEFT JOIN sys_dict_node n ON e.node_id = n.id
WHERE e.is_deleted = 0 AND e.source_id = 2 AND n.`code` IN (200,301,302,400,500 ) AND e.camera_id IS NOT NULL
GROUP BY e.camera_id
注意事项:此方式仅支持低于5.7版本的MySql(SELECT VERSION();)
关于高于5.7版本的,可在排序后添加l imit 999999,即可为最新一条。
具体可参考: https://blog.csdn.net/lglaljj123/article/details/79864188