前言

指定顺序排序,按照固定位置需求进行排序
借助MYSQL中的 FIELD()函数

FIELD() 函数是一种用于字符串比较的函数,可以将多个字符串进行比较,根据其出现的先后顺序返回其在整个比较中的位置。

文章后面附模拟库表

排序

下面将会以【指定排序部分】和【未指定排序部分】来区分
指定排序:使用了 FIELD() 函数的那部分
未指定排序部分:除指定排序部分以外,剩余的那部分

默认排序

例子:

1
SELECT * FROM demo_regedit r 

FIELD()函数不使用ASC/DESC

先将表里的数据分成【指定排序部分】和【非指定排序部分】两部分。
指定排序部分】的数据 会默认放到列表的最后面。【未指定排序部分】若没有指定排序,则按照默认原则

例子:

1
SELECT * FROM demo_regedit r ORDER BY FIELD( r.dynasty, '清朝', '宋朝', '元朝', '汉朝')

FIELD()函数使用ASC

  1. 先区分出 【指定排序部分】 和 【未指定排序部分】。
  2. 再将【指定排序部分】按照指定的锁死顺序排列。【未指定排序部分】若没有指定排序,则按照默认原则
  3. 然后用【指定排序部分ASC的第一个默认id】 和 【未指定排序部分的一个默认id】 进行比较,小的在前。

例子:

1
SELECT * FROM demo_regedit r ORDER BY FIELD( r.dynasty, '清朝', '宋朝', '元朝', '汉朝') ASC

FIELD()函数使用DESC

  1. 先区分出 【指定排序部分】 和 【未指定排序部分】。
  2. 再将【指定排序部分】按照指定的锁死顺序排列。【未指定排序部分】若没有指定排序,则按照默认原则
  3. 然后用【指定排序部分DESC的第一个默认id】 和 【未指定排序部分的一个默认id】 进行比较,小的在前。

例子:

1
SELECT * FROM demo_regedit r ORDER BY FIELD( r.dynasty, '清朝', '宋朝', '元朝', '汉朝') DESC

模拟库表

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
-- 创建库表
DROP TABLE IF EXISTS `demo_regedit`;
CREATE TABLE `demo_regedit` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '姓名',
`telephone` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '联系方式',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`dynasty` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='注册表';

-- 添加数据
INSERT INTO `demo_regedit` (`id`, `name`, `telephone`, `create_time`, `dynasty`) VALUES (1001, '刘询', '15011111111', '2023-06-10 09:00:00', '汉朝');
INSERT INTO `demo_regedit` (`id`, `name`, `telephone`, `create_time`, `dynasty`) VALUES (1002, '刘彻', '15022222222', '2023-07-06 09:00:00', '汉朝');
INSERT INTO `demo_regedit` (`id`, `name`, `telephone`, `create_time`, `dynasty`) VALUES (1003, '李世民', '15033333333', '2023-07-08 09:00:00', '唐朝');
INSERT INTO `demo_regedit` (`id`, `name`, `telephone`, `create_time`, `dynasty`) VALUES (1004, '李渊', '15044444444', '2023-07-10 09:00:00', '唐朝');
INSERT INTO `demo_regedit` (`id`, `name`, `telephone`, `create_time`, `dynasty`) VALUES (1005, '李显', '15055555555', '2023-07-11 09:00:00', '唐朝');
INSERT INTO `demo_regedit` (`id`, `name`, `telephone`, `create_time`, `dynasty`) VALUES (1006, '赵匡胤', '15066666666', '2023-07-16 09:00:00', '宋朝');
INSERT INTO `demo_regedit` (`id`, `name`, `telephone`, `create_time`, `dynasty`) VALUES (1007, '铁木真', '15077777777', '2023-07-16 09:00:00', '元朝');
INSERT INTO `demo_regedit` (`id`, `name`, `telephone`, `create_time`, `dynasty`) VALUES (1008, '溥仪', '15088888888', '2023-07-17 09:00:00', '清朝');
INSERT INTO `demo_regedit` (`id`, `name`, `telephone`, `create_time`, `dynasty`) VALUES (1009, '赵恒', '15099999999', '2023-07-18 09:00:00', '宋朝');
INSERT INTO `demo_regedit` (`id`, `name`, `telephone`, `create_time`, `dynasty`) VALUES (1010, '顺治', '18911111111', '2023-07-20 09:00:00', '清朝');
INSERT INTO `demo_regedit` (`id`, `name`, `telephone`, `create_time`, `dynasty`) VALUES (1011, '康熙', '18922222222', '2023-07-20 09:00:00', '清朝');
INSERT INTO `demo_regedit` (`id`, `name`, `telephone`, `create_time`, `dynasty`) VALUES (1012, '乾隆', '18933333333', '2023-07-20 09:00:00', '清朝');
INSERT INTO `demo_regedit` (`id`, `name`, `telephone`, `create_time`, `dynasty`) VALUES (1013, '雍正', '18944444444', '2023-07-23 09:00:00', '清朝');
INSERT INTO `demo_regedit` (`id`, `name`, `telephone`, `create_time`, `dynasty`) VALUES (1014, '刘邦', '18955555555', '2023-07-23 09:00:00', '汉朝');