MySQL order by 排序结果不正确

新建一张测试表:

CREATE TABLE `tb1` (

  `id` bigint(20) NOT NULL AUTO_INCREMENT,

  `a` decimal(19,2) NOT NULL,

  `acid` bigint(20) NOT NULL,

  `prid` bigint(20) NOT NULL,

  PRIMARY KEY (`id`),

  KEY `idx_prid` (`prid`),

  KEY `idx_acid` (`acid`)

) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

字段 a 没有索引,插入测试数据:

INSERT INTO `tb1` (`id`, `a`, `acid`, `prid`)
VALUES (1,2.00,3,2),(2,3.00,3,2),(3,4.00,2,3),(4,5.00,2,3),(5,6.00,2,3),(6,8.00,2,3),(7,10.00,2,3),(8,12.00,2,3),(9,16.00,2,3),(10,20.00,2,3),(11,6.00,2,4),(12,8.00,2,4),(13,10.00,2,4),(14,12.00,2,4),(15,5.00,2,2),(16,6.00,2,2);

查看表数据:

([yoon]> select * from tb1;
+----+-------+------+------+
| id | a     | acid | prid |
+----+-------+------+------+
|  1 |  2.00 |    3 |    2 |
|  2 |  3.00 |    3 |    2 |
|  3 |  4.00 |    2 |    3 |
|  4 |  5.00 |    2 |    3 |
|  5 |  6.00 |    2 |    3 |
|  6 |  8.00 |    2 |    3 |
|  7 | 10.00 |    2 |    3 |
|  8 | 12.00 |    2 |    3 |
|  9 | 16.00 |    2 |    3 |
| 10 | 20.00 |    2 |    3 |
| 11 |  6.00 |    2 |    4 |
| 12 |  8.00 |    2 |    4 |
| 13 | 10.00 |    2 |    4 |
| 14 | 12.00 |    2 |    4 |
| 15 |  5.00 |    2 |    2 |
| 16 |  6.00 |    2 |    2 |
+----+-------+------+------+

根据非索引字段且有重复数据的字段 a 进行 order by 排序:

([yoon]> select * from tb1 order by a desc ;
+----+-------+------+------+
| id | a     | acid | prid |
+----+-------+------+------+
| 10 | 20.00 |    2 |    3 |
|  9 | 16.00 |    2 |    3 |
| 14 | 12.00 |    2 |    4 |
|  8 | 12.00 |    2 |    3 |
| 13 | 10.00 |    2 |    4 |
|  7 | 10.00 |    2 |    3 |
| 12 |  8.00 |    2 |    4 |
|  6 |  8.00 |    2 |    3 |
| 11 |  6.00 |    2 |    4 |
| 16 |  6.00 |    2 |    2 |
|  5 |  6.00 |    2 |    3 |
|  4 |  5.00 |    2 |    3 |
| 15 |  5.00 |    2 |    2 |
|  3 |  4.00 |    2 |    3 |
|  2 |  3.00 |    3 |    2 |
|  1 |  2.00 |    3 |    2 |
+----+-------+------+------+

order by 和 limit 一起使用:

([yoon]> select * from tb1 order by a desc limit 4;
+----+-------+------+------+
| id | a     | acid | prid |
+----+-------+------+------+
| 10 | 20.00 |    2 |    3 |
|  9 | 16.00 |    2 |    3 |
| 14 | 12.00 |    2 |    4 |
|  8 | 12.00 |    2 |    3 |
+----+-------+------+------+

为 a 字段添加索引:

([yoon]> alter table tb1 add index idx_a(a);
Query OK, 0 rows affected (0.05 sec)
([yoon]> select * from tb1 order by a desc limit 4;
+----+-------+------+------+
| id | a     | acid | prid |
+----+-------+------+------+
| 10 | 20.00 |    2 |    3 |
|  9 | 16.00 |    2 |    3 |
| 14 | 12.00 |    2 |    4 |
|  8 | 12.00 |    2 |    3 |
+----+-------+------+------+

排序的时候再添加一个字段 id :

([yoon]> select * from tb1 order by a desc,id desc limit 4;
+----+-------+------+------+
| id | a     | acid | prid |
+----+-------+------+------+
| 10 | 20.00 |    2 |    3 |
|  9 | 16.00 |    2 |    3 |
| 14 | 12.00 |    2 |    4 |
|  8 | 12.00 |    2 |    3 |
+----+-------+------+------+

对于一个非唯一字段,无论是否含有索引,结果集都是不确定的。如果业务逻辑对分页或者order by结果集有比较高的严格要求 ,请记得利用唯一键排序。

原文地址:https://www.cnblogs.com/hankyoon/p/12614581.html

时间: 2024-10-08 10:28:11

MySQL order by 排序结果不正确的相关文章

mysql order by 排序的问题

参考博客http://blog.csdn.net/hollboy/article/details/13296601 mysql order by 的排序在今天时候遇到了问题 情景是:将排序的字段设置成varchar类型了,然后排序时候并没有按从大到小的顺序 按照图中的顺序应该是正序,9排在最上边,但是实际上是666排在最上边 解决办法之一 实际情况是先按最左边的开始排序然后在一位一位比下去,这里在写sql时候的解决办法可以是加0,或者前面加上--也可以哦 解决办法之二 将字段类型换成int类型看

MYSQL order by 排序的一个小问题探究

小问题发现: select * from `sql` where id=1 order by (select 1 union select 2) 正常返回结果 mysql> select * from `sql` where id=1 order by (select 1 union select 2); +----+------+ | id | new | +----+------+ | 1 | test | +----+------+ 1 row in set mysql> select

MYSQL order by排序与索引关系总结

MySQL InnoDB B-Tree索引使用Tips 这里主要讨论一下InnoDB B-Tree索引的使用,不提设计,只管使用.B-Tree索引主要作用于WHERE和ORDER BY子句.这里讨论的均在MySQL-Server-5.1.42测试 CREATE TABLE `friends` ( `ID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `uid`bigint(20) UNSIGNED NOT NULL DEFAULT '0', `fuid`

mysql order by排序查询速度问题

SELECT * FROM `assets_message` LEFT JOIN purchase_message ON assets_message.purchase_id = purchase_message.purchase_id WHERE `purchase_type` = 'oassets'AND purchase_message.assets_type = '002' ORDER BY purchase_message.purchase_id,assets_id SELECT *

MySQL如何利用索引优化ORDER BY排序语句

MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通过索引优化来实现MySQL的ORDER BY语句优化: 1.ORDER BY的索引优化.如果一个SQL语句形如:SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort];在[sort]这个栏位上建立索引就可以实现利用索引进行order by

MySQL中order by排序时,数据存在null咋办

order by排序是最常用的功能,但是排序有时会遇到数据为空null的情况,这样排序就会乱了,这里以MySQL为例,记录我遇到的问题和解决思路. 问题: 网页要实现table的行鼠标拖拽排序,我用AngularJs集成了一个TableDnD开源插件,可以实现,然后在数据库表中增加一个排序字段indexId,但是原来的大量数据是没有排序过的,所以该字段为null. 这样order by时,为null的数据就会排在最前边. 写个测试表模拟一下,如下效果: 解决办法: 最优办法:利用MySQL中的一

mysql order by多字段排序

mysql order by多字段排序,在同一表中必须按字段顺序,否则以最后一字段的排序为准,其他无效. 如:ORDER BY `user`.`state` DESC , `user`.`order_by` ASC state字段在order_by字段前面

Mysql Order By 字符串排序,mysql 字符串order by

Mysql Order By 字符串排序,mysql 字符串order by ============================== ?Copyright 蕃薯耀 2017年9月30日 http://fanshuyao.iteye.com/ 一.问题描述: Mysql排序时如果用的的字段为字符串型的,排序规则是这样的:如1,10,2,20,3,4,5,这种排序是按照字符从第一个字符开始比较出来的,但不是我想要的,我想要的是:1,2,3,4,5--,10,20这种. 二.解决方案 排序时,把

玩得一手好注入之order by排序篇

看了之前Gr36_前辈在先知上的议题,其中有提到排序注入,这个在最近经常遇到这样的问题,所以先总结下order by 排序注入的知识. 0×00 背景 看了之前Gr36_前辈在先知上的议题,其中有提到排序注入,这个在最近经常遇到这样的问题,所以先总结下order by 排序注入的知识. 0×01 环境信息 测试环境:操作系统ubuntu0.14.04.1 MYSQL:5.5.55-0 测试代码: <?php $mysql_server="10.10.10.136″; $mysql_user