您的位置:首页 > 数据库 > MySQL

mysql:分组中某字段最大值的查询结果

2018-09-17 17:49 363 查看

最近在用一款组态软件,涉及到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 为不重复的值) 

 

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: