详解Mysql order by与limit混用陷阱

吾爱主题 阅读:203 2024-04-02 08:01:59 评论:0

在Mysql中我们常常用order by来进行排序,使用limit来进行分页,当需要先排序后分页时我们往往使用类似的写法select * from 表名 order by 排序字段 limt M,N。但是这种写法却隐藏着较深的使用陷阱。在排序字段有数据重复的情况下,会很容易出现排序结果与预期不一致的问题。
如表:

查询第一页跟最后一页时出现:

解决办法:

?
1 SELECT * FROM purchaseinfo ORDER BY actiontime,id LIMIT 0,2;

上面的实际执行结果已经证明现实与想像往往是有差距的,实际SQL执行时并不是按照上述方式执行的。这里其实是Mysql会对Limit做优化,具体优化方式见官方文档:https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 /* Navicat MySQL Data Transfer   Source Server         : 本地mysql8.0 Source Server Version : 80018 Source Host           : localhost:3308 Source Database       : baihe   Target Server Type    : MYSQL Target Server Version : 80018 File Encoding         : 65001   Date : 2020-06-09 14:47:37 */   SET FOREIGN_KEY_CHECKS=0;   -- ---------------------------- -- Table structure for purchaseinfo -- ---------------------------- DROP TABLE IF EXISTS `purchaseinfo`; CREATE TABLE `purchaseinfo` (    `id` int (11) NOT NULL AUTO_INCREMENT,    `userId` int (11) DEFAULT '0' ,    `inout` varchar (1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL ,    `money` int (11) DEFAULT NULL ,    `actiontime` datetime DEFAULT NULL COMMENT 'jiaoyi' ,    PRIMARY KEY (`id`),    KEY `UserId` (`userId`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE =utf8mb4_0900_ai_ci;   -- ---------------------------- -- Records of purchaseinfo -- ---------------------------- INSERT INTO `purchaseinfo` VALUES ( '7' , '1' , 'I' , '10000' , '2020-06-09 18:05:41' ); INSERT INTO `purchaseinfo` VALUES ( '8' , '7788' , 'O' , '20000' , '2020-06-09 18:05:15' ); INSERT INTO `purchaseinfo` VALUES ( '9' , '7788' , 'I' , '20000' , '2020-06-09 18:05:15' ); INSERT INTO `purchaseinfo` VALUES ( '10' , '7788' , 'O' , '50000' , '2020-06-09 18:05:15' ); INSERT INTO `purchaseinfo` VALUES ( '11' , '1' , 'O' , '50000' , '2020-06-09 18:05:15' ); INSERT INTO `purchaseinfo` VALUES ( '12' , '1' , 'O' , '50000' , '2020-06-09 18:05:15' ); INSERT INTO `purchaseinfo` VALUES ( '13' , '1' , 'O' , '50000' , '2020-06-09 18:05:15' ); INSERT INTO `purchaseinfo` VALUES ( '14' , '1' , 'O' , '50000' , '2020-06-09 18:05:15' ); INSERT INTO `purchaseinfo` VALUES ( '15' , '1' , 'O' , '50000' , '2020-06-09 18:05:15' ); INSERT INTO `purchaseinfo` VALUES ( '16' , '1' , 'O' , '50000' , '2020-06-09 18:05:15' );

到此这篇关于详解Mysql order by与limit混用陷阱的文章就介绍到这了,更多相关Mysql order by与limit混用内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_37939964/article/details/106641773

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容