mysql分组后获取每个组排序后的第一条数据(整行)

摘要:
https://blog.csdn.net/persistencegoing/article/details/92764058Allrightsreserved.Nopartofthisarticlemaybereproducedordistributedbyanymeans,orstoredinadatabaseorretrievalsystem,withoutthepriorwrittenpe

https://blog.csdn.net/persistencegoing/article/details/92764058

All rights reserved.No part of this article may be reproduced or distributed by any means,or stored in a database or retrieval system,without the prior written permission of persistenceGoing author
https://blog.csdn.net/persistencegoing/article/details/84376427

有一个学生分数表student,数据结构是这样的

id(当前表ID) student_id(学生ID) line(分数) subject_type(科目类型)

1 1 80 1

2 1 78 1

3 1 56 1

4 2 99 1

5 2 20 1

我想根据学生分组,得到每个分组中分数最高的那一条数据:

先来几种错误的写法:
(1)SELECT
max.*, MAX(max.line) lineMax
FROM
(SELECT * FROM student) max
GROUP BY
student_id

这种写法你会发现line和lineMax的列中数据可能不一致

(2)SELECT
max.*, MAX(max.line) lineMax
FROM
(
SELECT
*
FROM
student
ORDER BY
line DESC
) max
GROUP BY
student_id

你可能会说排序之后再分组就对了,抱歉,这种情况下对于某些小伙伴可能还是会有问题

(3)SELECT
max.*, MAX(max.line) lineMax
FROM
(
SELECT
*
FROM
student
ORDER BY
line DESC
) max
GROUP BY
student_id
HAVING lineMax=line

这种情况下,表面上数据是对的,但是数据量大了之后你会发现有些数据丢失,其实还是错的

正确写法:
SELECT
max.*, MAX(max.line) lineMax
FROM
(
SELECT
*
FROM
student
ORDER BY
line DESC
LIMIT 100
) max
GROUP BY
student_id

在mysql5.7版本之后,必须再排序之后加上limit关键字,20万所测试的数据是正确的,亲测验证

注意:
limit 是必须要加的,如果不加的话,数据不会先进行排序,通过 explain 查看执行计划,可以看到没有 limit 的时候,少了一个 DERIVED 操作。

可用以下SQL对每组数据进行验证

SELECT
*
FROM
student
WHERE
student_id = 69
ORDER BY
line DESC
LIMIT 100

————————————————
版权声明:本文为CSDN博主「persistenceヾ(◍°∇°◍)ノ」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/persistencegoing/article/details/92764058

免责声明:文章转载自《mysql分组后获取每个组排序后的第一条数据(整行)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇一个相见恨晚的idea上的小功能——通过idea直接操作Linux上的文件git remote add 用法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【MySQL】MySQL层级数据的递归遍历

层级的业务数据在系统中很常见,如组织机构、商品品类等。如果要获取层级数据的全路径,除了缓存起来,就是递归访问的方式了: 将层级数据缓存在redis中,用redis递归获取层级结构。此方法效率高。 在MySQL中做递归遍历,(Oracle有递归的语法支持,而MySQL并没有),需要自己写函数去递归。此方法效率低。 程序运行基于效率要求,一般使用Redis...

zabbix 监控客户端数据库 zabbix客户端

[root@zabbix客户端 zabbix]# grep -v "^$" etc/zabbix_agentd.conf|grep -v "^#" LogFile=/tmp/zabbix_agentd.log Server=127.0.0.1,zabbix_server_ip ServerActive=zabbix_server_ip:10051#注...

关于使用MySQL语法ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql

前言: 在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新, 在刚碰到的时候,第一反应是将其实现分为两块,分别是判断增加,判断更新,后来发现在mysql中有ON DUPLICATE KEY UPDATE一步就可以完成,感觉实在是太方便了, 该语句是基于唯一索引或主键使用,比如一个字段a被加上了unique index,...

Python爬取上交所一年大盘数据

前言 文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者: 半个码农2018 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef...

canal使用小结

一、基本概念 mysql本身支持主从备份,原理就是主库master生成的binlog文件记录了所有的增删改操作语句,然后slave向master发送dump协议,master将binlog日志文件推送给从库slave解析执行,达到数据一致备份的目的。 canal,基于java开发,伪装成一个slave,去监听获取增量的binlog日志文件,然后解析处理获得...

mycat 1.6.6.1安装以及配置docker 安装mysql 5.7.24 双主多从读写分离主主切换

mycat和mysql的高可用参考如下两个图    简介:应用程序仅需要连接HAproxy或者mycat,后端服务器的读写分离由mycat进行控制,后端服务器数据的同步由MySQL主从同步进行控制。 服务器主机规划 IP  功能 备注 192.168.0.200 Mysql Master1 Mysql Master1端口3306 192....