MySQL 的 Field 杂谈

前言

Field 是 MySQL 中的一个函数,其基本使用方法如下:
作用
用于返回指定值在给定值列表中的索引位置
语法

1
FIELD(value, val1, val2, val3, ...)

例子

1
SELECT FIELD("q", "s", "q", "l");

上面的 sql 就是返回字母 qs,q,l 中的位置,这里和编程语言中不一样,返回的下标是从 1 开始的,所以上述的返回结果是 2

如果查找的字符不在列表里呢?

1
SELECT field("a","s", "q", "l");

返回为 0 ,结果如下:

应用场景

说完了,基本用法,说一下 Field 的应用场景,单纯从函数推测出它的应用场景,但是它的实际应用场景,在某种程度上还是很实用的,它可以自定义排序
所谓的自定义排序就是按照我们给定的顺序对数据结果进行排序,通常情况下,我们通过 order by field 无外乎就是降序或者升序排列,但是在某些特殊的业务场景下,你可能预期按照自己的规则去定义排序。

例子

如下表所示

默认的情况下,显然是按照 id 进行升序排列的,但是如果需要按照人名 a,c,b,d来排序。也就是 name=a,c,b,d 来排序。
这个时候就可以借由 field 函数去实现了:

1
SELECT * FROM user ORDER BY FIELD(name, 'a','c','b','d')

执行结果如下:

延伸

现在 user 表里新增了三条记录:

现在有这样子的需求,需要将记录先按照 x,y,z 排序,后面按照正常排序即结果如下:

如何可以做到?
原理其实很简单,归根结底就是 order byfield 的联合应用。首先需要明白,order by 的排序原理,order by 原理其实很简单,就是按照我们给定的排序字段(升序或者降序排列)

为什么 ‘a’,’c’,’b’,’d’

这个时候,再回到最初 user 表只有四条记录时,按照 a,c,b,d 排序

1
SELECT * FROM user ORDER BY FIELD(name, 'a','c','b','d')

这个 sql 发生了什么?

我们用 Field 函数构建了一个临时的排序字段,不同的 name 返回在 field 下返回不同的值,相当于构成了一个新的 sort_field 字段

所以这个时候结果就会按照 a,c,b,d 的顺序排列了。

如何 x,y,z 然后 a,b,c,d

首先如果如果按照 x,y,z 在最前面的要求,sql 应当是:

1
SELECT * FROM user ORDER BY FIELD(name, 'x','y','z')

结果如下:

这个时候的 sort_field 表现是这样子的:

我们预期的应当是

如果只是将排序由升序改为降序

1
SELECT * FROM user ORDER BY FIELD(name, 'x','y','z') DESC

这个时候结果如下:

这个结果已经接近 预期了,我们只需要将 field 后面的 x,y,z 变成 z,y,x 就可以了

1
SELECT * FROM user ORDER BY FIELD(name, 'z','y','x') DESC

结果如下: