跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

Mysql group by top N的问题_MySQL

bitsCN.com mysql group by top n的问题 MySQL(Linux) MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。 下载 在日常工作中,经常要查询分组的前几名. oracle 中可以通过row_num来支持查询,mysql暂时不支持row_num.那么如何来完成这个需求呢? 例如: 表中的数据:
+--------+-------+-----+| Person | Group | Age |+--------+-------+-----+| Bob | 1 | 32 || Jill | 1 | 34 || Shawn | 1 | 42 || Jake | 2 | 29 || Paul | 2 | 36 || Laura | 2 | 39 |+--------+-------+-----+
期望的结果:
+--------+-------+-----+| Shawn | 1 | 42 || Jill | 1 | 34 || Laura | 2 | 39 || Paul | 2 | 36 |+--------+-------+-----+
方式一:借鉴oracle中row_num的思想,在sql中增加伪列.
set @num := 0, @group := '';select person, `group`, agefrom ( select person, `group`, age, @num := if(@group = `group`, @num + 1, 1) as row_number, @group := `group` as dummy from mytable order by `Group`, Age desc, person) as x where x.row_number <= 2;
方式二:利用关联子查询
SELECT a.person, a.group, a.age FROM person AS a WHERE (SELECT COUNT(*) FROM person AS b WHERE b.group = a.group AND b.age >= a.age) <= 2 ORDER BY a.group ASC, a.age DESC
bitsCN.com

相关文章