使用 MySQL FIELD() 函数自定义排序规则

2020-01-05
次阅读
2 分钟阅读时长

一个栗子

订单表结构如下:

CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(60) NOT NULL COMMENT '订单标题',
  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '订单状态:1 待支付、2 支付中、3 已支付',
  PRIMARY KEY (`id`)
);

测试数据:

INSERT INTO `orders` VALUES (1, '订单1', 3);
INSERT INTO `orders` VALUES (2, '订单2', 1);
INSERT INTO `orders` VALUES (3, '订单3', 2);
INSERT INTO `orders` VALUES (4, '订单4', 1);

在展示订单列表的时候,要求将状态为支付中的展示在最前面,然后是状态为待支付、已支付。

一般的需求按照订单状态大小进行排序可以直接使用 ORDER BY 订单状态 完成,比如 待支付(1)、支付中(2)、已完成(3) 或者 已完成(3)、支付中(2)、待支付(1)

但是像上面这种需求,并不完全按照订单状态大小,而是按照指定的订单状态顺序 支付中(2)、待支付(1)、已完成(3) 来进行排序,当遇到这种情况就可以使用 FIELD() 函数了。

FEILD() 函数说明

函数结构:FIELD(s, s1, s2, s3...)

作用:返回第一个字符串 s 在字符串列表(s1, s2, s3…)中的位置。

简单示例:

SELECT FIELD('a', 'a', 'b', 'c', 'd');

+--------------------------------+
| FIELD('a', 'a', 'b', 'c', 'd') |
+--------------------------------+
|                              1 |
+--------------------------------+

SELECT FIELD('c', 'a', 'b', 'c', 'd');

+--------------------------------+
| FIELD('c', 'a', 'b', 'c', 'd') |
+--------------------------------+
|                              3 |
+--------------------------------+

使用 FIELD() 函数

在使用 FIELD() 函数进行排序的时候,只需要将状态按照上面要求的顺序进行排列,就可以实现了。

SELECT * FROM orders ORDER BY FIELD(`status`, 2, 1, 3);

+----+---------+--------+
| id | title   | status |
+----+---------+--------+
|  3 | 订单3 |      2 |
|  2 | 订单2 |      1 |
|  4 | 订单4 |      1 |
|  1 | 订单1 |      3 |
+----+---------+--------+

FIELD() 函数的返回值一起打印出来。

SELECT *, FIELD(`status`, 2, 1, 3) FROM orders ORDER BY FIELD(`status`, 2, 1, 3);

+----+---------+--------+--------------------------+
| id | title   | status | FIELD(`status`, 2, 1, 3) |
+----+---------+--------+--------------------------+
|  3 | 订单3 |      2 |                        1 |
|  2 | 订单2 |      1 |                        2 |
|  4 | 订单4 |      1 |                        2 |
|  1 | 订单1 |      3 |                        3 |
+----+---------+--------+--------------------------+

可以看到,实际上在查询的时候 ORDER BY 的是 FEILD() 函数的返回值,也就是 status 的值在 (2, 1, 3) 中的位置。

一句话总结,当遇到自定义排序规则时就可以使用 FEILD() 函数。

本文作者:她和她的猫
本文地址https://her-cat.com/posts/2020/01/05/custom-collation-using-mysql-field-function/
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!