【MySQL】深入理解ORDER BY的排序规则及多个字段排序的实现

引言

MySQL的ORDER BY语句在开发中经常用到,笔者突发奇想,ORDER BY底层的排序规则究竟是什么,以及在面临多个字段排序的时候该如何处理呢?本篇将带着这两个问题做一个简单的探索。

创建表并添加记录

首先是创建表,如下:

CREATE TABLE `cps_commodity_info` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `sku_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '商品skuId',
  `sku_name` varchar(100) NOT NULL DEFAULT '' COMMENT '商品名称',
  `price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '商品价格',
  `is_on_top` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否置顶,0:不置顶,1:置顶',
  `created_date` datetime NOT NULL COMMENT '创建时间',
  `modified_date` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `ldelete_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除标志,0:未删除,2:已删除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='cps商品信息';

随后手动插入几条数据,接下来分析会用到:

INSERT INTO `cps_commodity_info` VALUES (1, 60469019380, '精装拉面', 36.69, 0, '2019-12-20 16:37:00', '2019-12-31 16:37:05', 0);
INSERT INTO `cps_commodity_info` VALUES (2, 100003211179, '爆辣豆腐干', 22.66, 1, '2019-12-27 16:37:58', '2019-12-29 16:38:08', 0);
INSERT INTO `cps_commodity_info` VALUES (3, 100003255505, '清洁控油洗面奶', 46.78, 0, '2019-12-28 16:39:11', '2019-12-28 16:39:19', 0);
INSERT INTO `cps_commodity_info` VALUES (4, 55870972945, '圣诞节平安果', 16.52, 0, '2019-12-28 16:39:57', '2019-12-29 16:40:02', 0);
INSERT INTO `cps_commodity_info` VALUES (5, 63618008655, '无线蓝牙耳机', 188.88, 1, '2020-01-01 16:40:40', '2020-01-01 16:40:49', 0);

单字段排序

这里主要针对varchar类型进行分析,数字类型就根据数字大小排序,这点没什么需要特别说明的。
首先列出测试语句,查询字段的字节码。

SELECT c.sku_name, hex(c.sku_name) FROM cps_commodity_info c ORDER BY c.sku_name DESC;

如下图所示,单字段排序是以该字段的字节码进行排序的,当第一个字节相同,则比较第二个,以此类推。
在这里插入图片描述

多字段排序

假设现在有个需求,我想将置顶商品放在最上面(is_on_top字段),然后按照价格降序,怎样实现呢?其实也很简单:

SELECT * FROM cps_commodity_info c ORDER BY c.is_on_top DESC,c.price DESC;

如下图,结果就是我们想要的。注意,这种排序会优先按照第一个字段,即is_on_top,然后依次按照剩下的字段排序。
在这里插入图片描述

发布了28 篇原创文章 · 获赞 12 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/Carson_Chu/article/details/104061788
今日推荐