暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 的 Field 杂谈

3806

前言

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

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

例子

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

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

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

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

返回为 0 ,结果如下:


应用场景

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

例子

如下表所示


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

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

执行结果如下:

延伸

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

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

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

为什么 'a','c','b','d'

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

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 应当是:

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

结果如下:

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

我们预期的应当是


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

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

这个时候结果如下:

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

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

结果如下:



文章转载自桃子的学习笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论