zoukankan      html  css  js  c++  java
  • 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结果集有比较高的严格要求 ,请记得利用唯一键排序。

  • 相关阅读:
    C# 字典 Dictionary 转 JSON 格式遍历
    jquery-easyui-tree异步树
    android 开发环境搭建
    解决android sdk 无法更新
    043——VUE中组件之使用.sync修饰符与computed计算属性实现购物车原理
    laravel中数据库迁移的使用:
    002PHP文件处理——文件处理 is_dir mkdir getcwd chdir rmdir
    001PHP文件处理——文件处理disk_total_space disk_free_space basename dirname file_exists filetype
    042——VUE中组件之子组件使用$on与$emit事件触发父组件实现购物车功能
    041——VUE中组件之pros数据的多种验证机制实例详解
  • 原文地址:https://www.cnblogs.com/hankyoon/p/12614581.html
Copyright © 2011-2022 走看看