千家信息网

mysql的group by 语法讲义

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本文主要给大家介绍mysql的group by 语法讲义,文章内容都是笔者用心摘选和编辑的,mysql的group by 语法讲义具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下主
千家信息网最后更新 2026年11月02日mysql的group by 语法讲义

本文主要给大家介绍mysql的group by 语法讲义,文章内容都是笔者用心摘选和编辑的,mysql的group by 语法讲义具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下主题内容吧。

mysql的group by语法可以根据指定的规则对数据进行分组,分组就是将一个数据集划分成若干个小区域,然后再针对若干个小区域进行数据处理。本文将介绍mysql使用group by分组时,实现组内排序的方法。

相关mysql视频教程

mysql的group by语法可以对数据进行分组,但是分组后的数据并不能进行组内排序。
例如一个评论表有多个用户评论,需要获取每个用户最后评论的内容。

创建测试数据表及数据

CREATE TABLE `comment` (  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  `user_id` int(10) unsigned NOT NULL,  `content` varchar(200) NOT NULL,  `addtime` datetime NOT NULL,  `lastmodify` datetime NOT NULL,  PRIMARY KEY (`id`),  KEY `user_id` (`user_id`),  KEY `addtime` (`addtime`),  KEY `uid_addtime` (`user_id`,`addtime`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `comment` (`id`, `user_id`, `content`, `addtime`, `lastmodify`) VALUES(1, 1, '评论1', '2017-05-17 00:00:00', '2017-05-17 00:00:00'),(2, 1, '评论2', '2017-05-17 00:00:01', '2017-05-17 00:00:01'),(3, 2, '评论1', '2017-05-17 00:00:02', '2017-05-17 00:00:02'),(4, 2, '评论2', '2017-05-17 00:00:03', '2017-05-17 00:00:03'),(5, 3, '评论1', '2017-05-17 00:00:04', '2017-05-17 00:00:04'),(6, 1, '评论3', '2017-05-17 00:00:05', '2017-05-17 00:00:05'),(7, 4, '评论1', '2017-05-17 00:00:06', '2017-05-17 00:00:06'),(8, 4, '评论2', '2017-05-17 00:00:07', '2017-05-17 00:00:07'),(9, 4, '评论3', '2017-05-17 00:00:08', '2017-05-17 00:00:08'),(10, 4, '评论4', '2017-05-17 00:00:09', '2017-05-17 00:00:09'),(11, 3, '评论2', '2017-05-17 00:00:10', '2017-05-17 00:00:10');select * from comment;+----+---------+---------+---------------------+---------------------+| id | user_id | content | addtime             | lastmodify          |+----+---------+---------+---------------------+---------------------+|  1 |       1 | 评论1   | 2017-05-17 00:00:00 | 2017-05-17 00:00:00 ||  2 |       1 | 评论2   | 2017-05-17 00:00:01 | 2017-05-17 00:00:01 ||  3 |       2 | 评论1   | 2017-05-17 00:00:02 | 2017-05-17 00:00:02 ||  4 |       2 | 评论2   | 2017-05-17 00:00:03 | 2017-05-17 00:00:03 ||  5 |       3 | 评论1   | 2017-05-17 00:00:04 | 2017-05-17 00:00:04 ||  6 |       1 | 评论3   | 2017-05-17 00:00:05 | 2017-05-17 00:00:05 ||  7 |       4 | 评论1   | 2017-05-17 00:00:06 | 2017-05-17 00:00:06 ||  8 |       4 | 评论2   | 2017-05-17 00:00:07 | 2017-05-17 00:00:07 ||  9 |       4 | 评论3   | 2017-05-17 00:00:08 | 2017-05-17 00:00:08 || 10 |       4 | 评论4   | 2017-05-17 00:00:09 | 2017-05-17 00:00:09 || 11 |       3 | 评论2   | 2017-05-17 00:00:10 | 2017-05-17 00:00:10 |+----+---------+---------+---------------------+---------------------+

在comment表中,每个用户最后评论的内容就是id为6,4,11,10的记录。

使用group by查询

select * from comment group by user_id;+----+---------+---------+---------------------+---------------------+| id | user_id | content | addtime             | lastmodify          |+----+---------+---------+---------------------+---------------------+|  1 |       1 | 评论1   | 2017-05-17 00:00:00 | 2017-05-17 00:00:00 ||  3 |       2 | 评论1   | 2017-05-17 00:00:02 | 2017-05-17 00:00:02 ||  5 |       3 | 评论1   | 2017-05-17 00:00:04 | 2017-05-17 00:00:04 ||  7 |       4 | 评论1   | 2017-05-17 00:00:06 | 2017-05-17 00:00:06 |+----+---------+---------+---------------------+---------------------+

可以看到结果,分组后只会返回分组内的第一条数据。因为group by语法没有进行组内排序的功能,只会按mysql默认的排序显示。
如何才能对group by分组内的数据进行排序了,这个需要根据不同的需求处理。

1.id最大的,评论时间肯定最新

这种情况我们可以使用id代替时间去搜寻并组内排序,使用max(id)就可以获取到每个分组中最大的评论id(即最新的评论)

select * from comment where id in(select max(id) from comment group by user_id) order by user_id;+----+---------+---------+---------------------+---------------------+| id | user_id | content | addtime             | lastmodify          |+----+---------+---------+---------------------+---------------------+|  6 |       1 | 评论3   | 2017-05-17 00:00:05 | 2017-05-17 00:00:05 ||  4 |       2 | 评论2   | 2017-05-17 00:00:03 | 2017-05-17 00:00:03 || 11 |       3 | 评论2   | 2017-05-17 00:00:10 | 2017-05-17 00:00:10 || 10 |       4 | 评论4   | 2017-05-17 00:00:09 | 2017-05-17 00:00:09 |+----+---------+---------+---------------------+---------------------+

2.id与评论时间没有关系,id大的评论时间可能不是最新

这种情况我们就需要使用max(addtime)来获取最新的评论,但因为不同用户的评论时间有可能相同,因此还需要加多user_id这个条件去查询。

重新创建测试数据

truncate table comment;INSERT INTO `comment` (`id`, `user_id`, `content`, `addtime`, `lastmodify`) VALUES(1, 1, '评论1', '2017-05-17 00:00:00', '2017-05-17 00:00:00'),(2, 1, '评论2', '2017-05-17 00:10:01', '2017-05-17 00:10:01'),(3, 2, '评论1', '2017-05-17 00:10:02', '2017-05-17 00:10:02'),(4, 2, '评论2', '2017-05-17 00:00:03', '2017-05-17 00:00:03'),(5, 3, '评论1', '2017-05-17 00:10:04', '2017-05-17 00:10:04'),(6, 1, '评论3', '2017-05-17 00:00:05', '2017-05-17 00:00:05'),(7, 4, '评论1', '2017-05-17 00:00:06', '2017-05-17 00:00:06'),(8, 4, '评论2', '2017-05-17 00:10:07', '2017-05-17 00:10:07'),(9, 4, '评论3', '2017-05-17 00:00:08', '2017-05-17 00:00:08'),(10, 4, '评论4', '2017-05-17 00:00:09', '2017-05-17 00:00:09'),(11, 3, '评论2', '2017-05-17 00:00:10', '2017-05-17 00:00:10');select * from comment;+----+---------+---------+---------------------+---------------------+| id | user_id | content | addtime             | lastmodify          |+----+---------+---------+---------------------+---------------------+|  1 |       1 | 评论1   | 2017-05-17 00:00:00 | 2017-05-17 00:00:00 ||  2 |       1 | 评论2   | 2017-05-17 00:10:01 | 2017-05-17 00:10:01 ||  3 |       2 | 评论1   | 2017-05-17 00:10:02 | 2017-05-17 00:10:02 ||  4 |       2 | 评论2   | 2017-05-17 00:00:03 | 2017-05-17 00:00:03 ||  5 |       3 | 评论1   | 2017-05-17 00:10:04 | 2017-05-17 00:10:04 ||  6 |       1 | 评论3   | 2017-05-17 00:00:05 | 2017-05-17 00:00:05 ||  7 |       4 | 评论1   | 2017-05-17 00:00:06 | 2017-05-17 00:00:06 ||  8 |       4 | 评论2   | 2017-05-17 00:10:07 | 2017-05-17 00:10:07 ||  9 |       4 | 评论3   | 2017-05-17 00:00:08 | 2017-05-17 00:00:08 || 10 |       4 | 评论4   | 2017-05-17 00:00:09 | 2017-05-17 00:00:09 || 11 |       3 | 评论2   | 2017-05-17 00:00:10 | 2017-05-17 00:00:10 |+----+---------+---------+---------------------+---------------------+

符合条件的应该是id为2,3,5,8的记录

select a.* from comment as a right join (select user_id, max(addtime) as maxtime from comment where user_id is not null group by user_id) as b on a.user_id=b.user_id and a.addtime=b.maxtime order by a.user_id asc;+------+---------+---------+---------------------+---------------------+| id   | user_id | content | addtime             | lastmodify          |+------+---------+---------+---------------------+---------------------+|    2 |       1 | 评论2   | 2017-05-17 00:10:01 | 2017-05-17 00:10:01 ||    3 |       2 | 评论1   | 2017-05-17 00:10:02 | 2017-05-17 00:10:02 ||    5 |       3 | 评论1   | 2017-05-17 00:10:04 | 2017-05-17 00:10:04 ||    8 |       4 | 评论2   | 2017-05-17 00:10:07 | 2017-05-17 00:10:07 |+------+---------+---------+---------------------+---------------------+

使用right join可以减少外层的数据集。
where user_id is not null 可以使group by user_id时使用索引。

看完以上关于mysql的group by 语法讲义,很多读者朋友肯定多少有一定的了解,如需获取更多的行业知识信息 ,可以持续关注我们的行业资讯栏目的。


评论 数据 分组 语法 排序 时间 内容 用户 讲义 不同 最大 区域 就是 情况 条件 笔者 行业 处理 查询 测试 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海喔噻互联网科技有限公司 天津市摩尔互联网科技 云之行互联网科技 湖南永感互联网科技有限公司 期待互联网科技 亿人帮互联网科技 镁科技互联网资讯平台 青海省互联网新科技 科技与互联网的利与弊 互联网科技博主是什么意思 哈尔滨新华互联网科技学院 阿里巴巴算科技企业还是互联网 浙江互联网科技研学营 千方科技属于互联网企业吗 哈尔滨屹滨互联网科技有限公司 恒生互联网科技业指数调整周期 沐思想互联网科技有限公司 梅州GM互联网络科技有限公司 互联网与数字科技关系 互联网高科技绘画 互联网科技有限公司经营范围 互联网科技logo设计 四川狮子座互联网科技 老年人脱离互联网科技的作文 每天都有哪些好的互联网科技 启辰互联网科技 四川互联网展示科技馆设计 工业互联网科技成果转化 青岛互联网科技园 现代科技的标志之一的互联网
0