最近在用一款组态软件,涉及到sql查询来得出数据集。需要在一定的限制下,得出想要的查询结果。某些查询的方法整理一下。
这次记录的是分组中某字段最大值的查询结果:
比如:从一张记录装置缺陷的表中,查询出每个装置的最新的一条缺陷记录。
正确的sql,下面这条语句是其中一种可行的方法:
SELECT t.* FROM (SELECT * FROM sms_equipment_defect ORDER BY faultTime DESC) t GROUP BY t.equipmentMrid ;
这个查询,即能查出sms_equipment_defect表中按照t.equipmentMrid分组,faultTime字段值最大的每条数据。
因为:首先mysql分组时,mysql 手册上面说,GROUP BY 时是按照某种顺序排序的,某种顺序到底是什么顺序?其实根本没有顺序。所以,需要用子查询对表中的内容进行排序,然后,再分组时,分组结果就是取得最上面的一条记录,即,每组中faultTime最大的那个记录。
备注:对于分组中某字段最大值的查询,一些错误的sql方法:
1、错误形式1:
SELECT * FROM sms_equipment_defect GROUP BY equipmentMrid ORDER BY faultTime DESC;
这条语句选择出来的每一条记录是最早的记录,原因是 group by 会比 order by 先执行,这样也就没有办法将 group by 之前,也就是在分组之前进行排序了。
2、错误形式2:
SELECT *,max(faultTime) as max_faultTime FROM sms_equipment_defect GROUP BY equipmentMrid ORDER BY faultTime DESC
这条语句的没错是选出了最大发布时间,但是你可 以对比一下 faultTime和 max_faultTime 并不相等,即不是同一条!(可能记录有相当的情况,就是分组的目标记录只有一条的时候!)
为 什么呢?原因很简单,这条语句相当于是 在group by 以后选出本组的最大的发布时间!对分组没有起到任何影响!因为SELECT子句是最后执行的!
3、错误形式3:
SELECT *,max(faultTime ) as max_line FROM sms_equipment_defect GROUP BY equipmentMrid HAVING faultTime =max(faultTime )
其实,这条错误语句,等同于下面的语句:
SELECT *,max(faultTime ) as max_line FROM sms_equipment_defect GROUP BY equipmentMrid HAVING count(*)=1 ;
faultTime =max(faultTime ) 只有在分组中的记录只有一条的时候才成立,原因很明白吧!只有一条他才会和本组的最大发布时间相等阿,(默认faultTime 为不重复的值)
---------------------
作者:yoyofu007
来源:CSDN
原文:https://blog.csdn.net/yoyofu007/article/details/82734608
版权声明:本文为博主原创文章,转载请附上博文链接!