1.背景在开发过程中,遇到需要根据device_code对数据进行分组,并获取每组数据中最新的一条数据。2.遇到的问题2.1初步思路:先orderBy数据再groupBysql语句:sql:SELECT*fromy_device_eventsORDERBYcreated_atDESCGROUPBYdevice_code结果:这种写法会报错,用groupBy和orderBy的时候在组合的时候,高级的groupBy必须在orderBy中进行。2.2进阶思路:OrderBy数据作为临时表,然后对临时表进行分组SQL语言:sql:SELECT*from(SELECT*fromy_device_eventsORDERBYcreated_atDESC)asnew_tableGROUPBYnew_table.device_code结果:这条语句执行了,但是结果并没有像预期的那样过滤掉最新的。3、最终方案3.1初步方案通过前面两个方案,发现直接使用orderBy和groupBy并不能达到目的,最后觉得可以和自己关联。按关系查询过滤。选择`y_device_events`。*从`y_device_events`LEFTJOIN`y_device_events`AS`new_table`ON`y_device_events`.`device_code`=`new_table`.`device_code`AND`y_device_events`.`created_at`<`new_table`.`created_at``WHERE`new_table`.`created_at`ISNULL这个方法通过左关联查询过滤笛卡尔积就可以达到我们的目的。3.2缺点:对于数据量特别大的情况,如果没有限制的话,得到的笛卡尔积会非常大,所以查询速度慢。3.3最后一种写法我可以根据自己的需要加上type和sub_type的限制,这样可以稍微加快数据筛选的速度,如果有数据过滤条件,可以把条件放在JOIN语句里,而不是放在where里在加入完成中SELECT`y_device_events`.*FROM`y_device_events`LEFTJOIN`y_device_events`AS`new_table`ON`y_device_events`.`device_code`=`new_table`.`device_code`AND`y_device_events`.`created_at`<`new_table`.`created_at`AND`y_device_events`.`type`=`new_table`.`type`AND`y_device_events`.`sub_type`=`new_table`.`sub_type`AND`y_device_events`.`type`=`2`AND`y_device_events`。`sub_type`=`1`WHERE`new_table`.`created_at`ISNULLAND`y_device_events`.`created_at`>'2018-07-0510:07:27'AND`y_device_events`.`created_at`<'2018-07-0511:04:27'AND`y_device_events`.`result_code`='-1'添加过滤条件后,可以大大加快查询效率。
