首页
学习
活动
专区
圈层
工具
发布

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 条的结果不一致   那到底是哪种方式不对

2.8K10

mysql:深究 sql 默认排序 order by

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

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

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

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

    28.4K32

    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

    11.6K30

    不同的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的变量

    1K10

    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进行排序,大小写不敏感

    4.3K30

    SQL优化案例分享 | 为什么MySQL 5.7以前GROUP BY会排序?如何避免隐式排序?

    你是否曾经困惑:为什么相同的GROUP BY语句在不同MySQL版本上性能差异巨大?今天我们揭秘MySQL隐式排序的"黑历史",助你轻松优化查询性能!...之后,MySQL优化器开始有所改进,在某些情况下,如果查询结果不需要排序,MySQL会通过避免不必要的排序来提升性能。...监控SQL执行计划 如果查询计划中出现了 Using filesort,说明查询进行了排序操作,此时可以考虑使用上述方法优化。 5....使用专业SQL优化工具 使用PawSQL等专用SQL优化工具,它可以从复杂的SQL文本中识别隐藏排序的隐患,并根据数据库的类型和版本,自动决定是否添加order by null....一招提升子查询性能 SQL优化案例分享 | PawSQL 近日推出 Lateral Join 重写优化算法 SQL优化案例分享 | PawSQL 优化器谓词下推算法实现分析 SQL优化案例分享 | 从321

    49710

    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版本中,支持降序索引,我们也可以创建降序索引。

    3K30

    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语句,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。

    2.8K30

    【SQL】进阶知识 -- 随机取数的几种方式

    那么,如何在不同的数据库系统中实现“随机取数”呢? 今天我们就来聊聊这个话题,看看在 MySQL、PostgreSQL、SQL Server 和 Oracle 中,如何快速且高效地随机抽取4条数据。...二、MySQL 中随机取数 MySQL 提供了一个非常简单的方式来随机排序数据,那就是使用 RAND() 函数。...LIMIT 4:只取前4条记录。 注意: RAND() 会为每一行生成一个随机数,排序时效率会比较低。如果你的数据量非常大,使用 RAND() 可能会带来性能问题。...三、PostgreSQL 中随机取数 在 PostgreSQL 中,随机排序的函数是 RANDOM(),它的工作原理和 MySQL 中的 RAND() 类似。...ORDER BY NEWID():根据 GUID 排序,达到随机排序的效果。 TOP 4:只取前4条记录。

    2.3K00

    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 排序算法,这样排序过程中一次可以排序更多行,但是需要再回到原表去取数据。

    2.5K30

    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优化的两个重要概念,索引覆盖和回表,我在前面的文章中详细介绍过这两个概念。

    4.1K21

    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,

    5.4K20

    分页别写太顺手,LIMIT 背后还有排序和边界

    分页别写太顺手,LIMIT 背后还有排序和边界MySQL 里写分页,最常见的就是 limit。...取前几条写 limit 10,分页写 limit 10 offset 20,老代码里还经常能看到 limit 20, 10 这种逗号写法。...如果只是取几条临时看数据,不写排序也能返回结果;但只要叫“前 5 条”,就应该先说清楚按什么顺序算前 5 条。这里按 id 排,返回 1 到 5 才有明确含义。接着看分页。...SQL 没有声明排序时,结果顺序不应该被分页逻辑依赖。同一张材料里再补了一条带 order by id 的查询,返回仍然是 1 到 5。差别不在这次小表输出,而在 SQL 是否把顺序说清楚了。...分页 SQL 可以先按 MySQL 的习惯写起来,但每条分页查询都要问一句:这个列表到底按什么字段稳定排序。这组实验没有证明深分页性能,也没有比较不同写法的执行计划。

    44600

    SQL Server 与 MySQL 中排序规则与字符集相关知识的一点总结

    在SQL Server中,任何一种字符集的数据库,都能存储任何一种语言的字符。...SQL Server中的字符集和排序规则 排序规则只不过是指定了存储的数据的排序(比较)规则而已,换句话说就是,排序规则中已经包含了字符集的信息。...在MySQL中的字符集和排序规则 上面说了,排序规则是依赖于字符集的,一种字符集可以有多种排序规则,但是一种排序规则只能基于某一种字符集的。如下是MySQL中排序规则和字符集的对应关系。 ?...所以要想区分大小写,有没有特殊需求,就直接使用utf8_bin(实际上***_general_cs在MySQL中本身就不支持,在SQL Server中支持)。...以上字符集的特点以及使用情况在SQL Server中表现为类似。

    1.6K50

    看一遍就理解: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个员工的姓名、年龄,并且按照年龄小到大排序,如果年龄相同,则按姓名降序排。

    1.8K21
    领券