mysql:分组中某字段最大值的查询结果
最近在用一款组态软件,涉及到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 为不重复的值)
阅读更多
- mysql 分组查询的结果当成临时表 在求最大值
- mysql查询分组后显示某一字段最大值行
- mysql分组查询获取组内某字段最大的记录
- 从Mysql查询的结果,写入txt文件中,每个字段用|分隔,下一条数据要换行
- Mysql 数据分组取某字段值所有最大的记录行
- MySQL中group_concat函数,用符号连接查询分组里字段值
- 【MySQL】按某一字段分组取最大(小)值所在行的数据
- MySQL之——GROUP BY分组取字段最大值
- mysql按字段分组,取最大值记录(转载)
- mysql在查询结果中增加排序字段
- MySql将列转为字段的分组查询
- oracle通过表中2个字段分组查询取数量最大的所有记录,有条件的去重
- oracle中查询以某一字段分组下另一个字段的最大值
- mysql将查询结果中字段合并为字符串group_concat函数
- MySQL中给自定义的字段查询结果添加排名的方法
- Mysql按字段分组取最大值记录
- mysql分组查询数据,将数据中null和''作为一组查询结果
- MYSQL之排除重复结果只取字段最大值
- mysql 分组查询某一列最大的前10条记录
- mysql查询某字段的多条结果展示成按逗号隔开