首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL 分组排序后 → 如何N条或倒数N条

前情回顾   前两天翻自己的博客的时候,翻到了:记一次有意思的 SQL 实现 → 分组后每组的第一条记录   突然意识到好像有续集没写   翻到结尾,果然有个留疑   但我要强调一点:这是我给你们的留疑...N条或倒数N条   我们回到标题,分组排序后,如何N条记录或倒数N条记录   循环查数据库   1、先批量查询 task_id   2、再根据 task_id 逐个去查 t_task_exec_log...,排序获取N条记录   3、最后进行一个数据汇合,封装成页面需要的数据格式   但这种方式会循环查数据库,一般是被禁止的   GROUP BY 结合 MySQL 函数   1、先批量查询 task_id...,N条或倒数N条   第一条   结果如下    5 条 SELECT * from ( SELECT *, ROW_NUMBER() OVER(PARTITION BY task_id...再看 GROUP BY 结合 MySQL 函数   我们仔细看看 GROUP BY 结合 MySQL 函数 倒数 5 条的结果   我们发现和窗口函数的倒数 5 条的结果不一致   那到底是哪种方式不对

73510

mysql:深究 sql 默认排序 order by

mysql 语句中如果没有使用 order by 来排序,通常会用 主键正序排列,但是有的时候不是这样,来看一个实例。...实例 ---- 群友问:请教一个问题,mysql 默认排序问题,当sql 语句 的排序没有指定 主键(id)的时候是按着什么规则排序的呢? ?...这个 sql 语句 当 hit_count = 0 和 uptime = 0 时 的数据和 跟 limit_count 变化 ?...大概意思就是数据储存的表 不是有序的,而是一个集合,在没有使用 order by 来排序的时候,不能默认就是 根据主键排序。...结论 ---- 到这大家应该明白了,mysql 的没有默认排序,如果需要排序一定要加上 order by 来排序,大家有没有遇到过这样的问题,欢迎一起来讨论,如果有不对的地方,请指正,感谢。

4.1K20
您找到你想要的搜索结果了吗?
是的
没有找到

SQL分组查询后每组的N条记录

而业务系统的官网上需要滚动展示一些热门资讯信息列表(浏览量越大代表越热门),而且每个类别的相关资讯记录至多显示3条,换句话:“按照资讯分类分组,每组的3条资讯信息列表”。...资讯信息记录表 需求 :热门的资讯信息列表且每个类别只3条。 二、核心思想 一般意义上我们在N条记录时候,都是根据某个业务字段进行降序排序,然后N条就能实现。...形如“select * from info order by views asc limit 0,3 ”,这条SQL就是info表中的3条记录。...但是当你仔细阅读我们的题目要求,你会发现:“它是让你每个类型下都要浏览量的3条记录”。 一种比较简单但是粗暴的方式就是在Java代码中循环所有的资讯类型,取出每个类型的3条记录,最后进行汇总。...这时候我们就想到了子查询,而且MySQL是可以实现这样的功能子查询的。

25.8K32

mysql分组最大(最小、最新、N条)条记录

在数据库开发过程中,我们要为每种类型的数据取出几条记录,或者是最新、最小、最大等等,这个该如何实现呢,本文章向大家介绍如何实现mysql分组最大(最小、最新、N条)条记录。...5, 'b5'); 数据表如下: name val memo a 2 a2 a 1 a1 a 3 a3 b 1 b1 b 3 b3 b 2 b2 b 4 b4 b 5 b5 按name分组val...按name分组val最小的值所在行的数据 方法一: select a.* from tb a where val = (select min(val) from tb where name = a.name...  sql如下: select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name...//这个是sql server的 //mysql应该是 select a.* from tb a where val = (select val from tb where name = a.name

8.3K30

不同的SQL平台,如何百分之N的记录?

最近帮业务部门梳理业务报表,其中有个需求是就算某指标等待时间最长的百分之十,其实就是对等待时长进行倒序排序后,结果集的百分之十。...这个需求在SQL Server和Oracle上都很容易实现,甚至是在MySQL 8.0也很容易实现,只是恰好我们业务数据库是MySQL 5.7先给大家介绍下不同数据库平台的实现方法。...SQL Server实现方法 SQL Server上有个TOP Percent的方法可以直接取结果的(或后)百分之N 例如有如下一张City表 我们10%的数据记录可以这样写: SELECT TOP...ROW_NUM FROM City A , (SELECT @row_num:=0) B ORDER BY ID DESC 这样我们就可以得到一张有自增长列的结果集了,接下来还是按照上面类似的方法,...总结 其中有涉及一些知识点,需要小伙伴们自己去进一步了解: SQL Server的TOP PERCENT Oracle的ROWNUM,子查询排序 ROW_NUMBER() OVER() MySQL的变量

11210

Mysql常用sql语句(7)- order by 对查询结果进行排序

测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 通过select出来的结果集是按表中的顺序来排序的...[ASC | DESC] ASC:升序排序,默认值 DESC:降序排序 注意点 order by关键字后可以跟子查询(后面展开讲) 如果字段值是NULL,则当最小值处理 如果指定多个字段排序,则按照字段的顺序从左往右依次排序...单字段排序的栗子 根据id倒序排序 select * from yyTest order by id desc; ?...多字段排序的栗子 先根据sex倒序排序,然后根据height升序排序 select * from yyTest order by sex desc, height asc; ?...知识点 对多个字段排序时,只有第一个排序字段有相同的值,才会对第二个字段进行排序,以此类推 如果第一个排序字段的所有数据都是唯一的,将不会对第二个排序字段进行排序,以此类推 按字母(A-Z进行排序,大小写不敏感

2.7K30

MySQL进阶学习之SQL优化【插入,主键,排序,分组,分页,计数】

​ 主键顺序插入 : 1 2 3 4 5 7 8 9 15 21 88 89 大批量插入数据 如果一次性需要插入大批量数据(比如: 几百万的记录),使用insert语句插入性能较低,此时可以使用MySQL...`username`) ​ ) ENGINE = INNODB DEFAULT CHARSET = utf8; 2、设置参数 -- 客户端连接服务端时,加上参数 -–local-infile mysql...像这样当页总删除的记录达到 MERGE_THRESHOLD(默认为页的50%),InnoDB会开始寻找最靠近的页(或后)看看是否可以将两个页合并以优化空间使用。...3、order by 优化 MySQL排序,有两种方式: Using filesort : 通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sortbuffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫...在MySQL8版本中,支持降序索引,我们也可以创建降序索引。

2.1K30

mysql截取几个字符串_MySQL 截取字符串函数的sql语句

从第三个字符开始,之后的所有个字符 SELECT SUBSTRING(‘成都融资事业部’,3) 结果:融资事业部 5、SUBSTRING(name, -4) 截取name这个字段的第 4 个字符位置(倒数)开始,...直到结束 SELECT SUBSTRING(‘成都融资事业部’,-4) 结果:资事业部 6、SUBSTRING(name, -4,2) 截取name这个字段的第 4 个字符位置(倒数)开始,只截取之后的...substring_index(‘www.baidu.com’, ‘.’, -2) 结果:baidu.com 9、SUBSTR(name, 1, CHAR_LENGTH(name)-3) 截取name字段,除...name字段后三位的所有字符 SELECT SUBSTR(‘成都融资事业部’, 1, CHAR_LENGTH(‘成都融资事业部’)-3) 结果:成都融资 总结 以上所述是小编给大家介绍的MySQL 截取字符串函数的...sql语句,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。

1.7K30

Mysql中orderby底层执行流程

假设你要查询城市是苏州的所有人名字,并且按照姓名进行排序返回 1000 个人的姓名、年龄,这条 sql 语句应该如何写?...对sort_buffer中的数据按照字段name做快速排序。 按照排序结果 1000 行返回给客户端。 我们称这个排序过程为全字段排序,执行的流程图如下: ?...max_length_for_sort_data,是 MySQL 中专门控制用于排序的行数据的长度的一个参数。它的意思是,如果单行的长度超过这个值,MySQL 就认为单行太大,要换一个算法。...对sort_buffer中的数据按照字段name做快速排序。 遍历排序结果, 1000 行,并按照 id 的值回到原表中取出 city、name 和 age 三个字段返回给客户端。...全字段排序 VS rowid 排序 如果 MySQL 实在是担心排序内存太小,会影响排序效率,才会采用 rowid 排序算法,这样排序过程中一次可以排序更多行,但是需要再回到原表去取数据。

1.8K30

MySQL——优化嵌套查询和分页查询

优化分页查询 在MySQL中做分页查询,MySQL 并不是跳过 offset 行,而是 offset+N 行,然后返回放弃 offset 行,返回 N 行,那当 offset 特别大的时候,效率就非常的低下...例如“limit 1000,20”,此时MySQL排序1020条数据后仅仅需要第1001到1020条记录,1000条数据都会被抛弃,查询和排序的代价非常高。...由此可见MySQL的分页处理并不是十分完美,需要我们在分页SQL上做一些优化,要么控制返回的总页数,要么对超过特定阈值的页数进行 SQL 改写。...现在假设要对电影表film排序某一页数据 explainselect*fromfilm orderbytitle limit50,5; 可以看到优化器实际上做了全表扫描,处理效率不高。...第一种优化思路 在索引上完成排序分页的操作,最后根据主键关联回表查询所需要的其他列内容。 画外音:此处涉及到了SQL优化的两个重要概念,索引覆盖和回表,我在前面的文章中详细介绍过这两个概念。

2.8K21

MySQL学习,详解分页查询(limit)

count:跳过offset⾏之后开始数据,count⾏记录;范围:[0,+∞)。 limit中offset和count的值不能⽤表达式。 下⾯我们列⼀些常⽤的⽰例来加深理解。...获取n⾏记录 select 列 from 表 limit 0,n; 或者 select 列 from 表 limit n; ⽰例,获取订单的2条记录,如下: mysql> create table...MySQL server version for the right syntax to use near 'limit -1,-1' at line 1 排序分⻚存在的坑 准备数据: mysql>...我们来分析⼀下上⾯的原因:主要是b字段存在相同的值,当排序过程中存在相同的值 时,没有其他排序规则时,mysql懵逼了,不知道怎么排序了。...建议:排序中存在相同的值时,需要再指定⼀个排序规则,通过这种排序规则不存在⼆义 性,⽐如上⾯可以再加上a降序,如下: mysql> select * from test1 order by b asc,

2.3K20

看一遍就理解:order by详解!

我们现在有这么一个需求:查询10个,来自深圳员工的姓名、年龄、城市,并且按照年龄小到大排序。...id,即图中的id=13; 重复步骤 3、4 直到city的值不等于深圳为止; 前面5步已经查找到了所有city为深圳的数据,在 sort_buffer中,将所有数据根据age进行排序; 按照排序结果...这个参数就是max_length_for_sort_data,它表示MySQL用于排序行数据的长度的一个参数,如果单行的长度超过这个值,MySQL 就认为单行太大,就换rowid 排序。...的值不等于深圳为止; 前面5步已经查找到了所有city为深圳的数据,在 sort_buffer中,将所有数据根据age进行排序; 遍历排序结果,10行,并按照 id 的值回到原表中,取出city、name...假设有联合索引 idx_age_name, 我们需求修改为这样:查询10个员工的姓名、年龄,并且按照年龄小到大排序,如果年龄相同,则按姓名降序排。

97220

MySQL - 分页查询优化的两个案例解析

中的分页查询 就是 limit呗 ,你有没有感觉到 越往后翻页越慢 ,常见的SQL如下 mysql> select * from employees limit 10000,10; 就是从 employees...MySQL是怎么处理这个SQL的呢? 先读取 10010 条记录,然后抛弃 10000 条记录,仅保留10 条想要的数据 。 可想而知,如果要查询一张大表比较靠后的数据,这效率是非常低的。...如果原 SQL 是 order by 非主键的字段,按照上的方法改写会导致两条 SQL 的结果不一致。...让排序时返回的字段尽可能少–》 只返回id , 然后用返回的特定范围的id ,再和原表关联,只特定范围内的数据 ,肯定比全表扫描要快。...原 SQL 使用的是 filesort 排序,优化后的 SQL 使用的是索引排序。 当然了,结果集也是和优化是一致的 ?

1.2K30

开发和测试中遇到的其他问题(持续更新)

小结一下啥时候用@param指定参数名称 1.动态sql中时候(包括test if这样的) 2.多个参数 3.别名 4.映射sql中 使用进行取值(其实和刚刚我们的 默认指定 一样,这里默认用...{value}`取值) 3 .各工具时间戳 postman {{$timestamp}} mysql UNIX_TIMESTAMP() JAVA System.currentTimeMillis()...Base64.decodeBase64("要解析的str"), "要转换为的识别码"); new String(Base64.decodeBase64("要解析的str"), "gb2312"); 6. mysql...在order by 和 limit联用情况下造成分页数据重复或者排序不稳定情况 sql 查询结果 我们发现我们sql3六条不是sql2排的6条,如果我们limit6,6可能还会出现6条中的数据...官方文档也有解释,https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html

1K30

MySQL深入学习第十六篇-“order by”是怎么工作的?

还是以我们前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回 1000 个人的姓名、年龄。...对 sort_buffer 中的数据按照字段 name 做快速排序; 7. 按照排序结果 1000 行返回给客户端。...对 sort_buffer 中的数据按照字段 name 进行排序; 7. 遍历排序结果, 1000 行,并按照 id 的值回到原表中取出 city、name 和 age 三个字段返回给客户端。...但是由于这条 SQL 语句不是要单独地查一个 city 的值,而是同时查了"杭州"和" 苏州 "两个城市,因此所有满足条件的 name 就不是递增的了。也就是说,这条 SQL 语句需要排序。...现在 A 和 B 是两个有序数组,然后你可以用归并排序的思想,得到 name 最小的 100 值,就是我们需要的结果了。

59120
领券