一、前言
今天在团结友爱的日更群里出现了下图的问题,关键词输入后优先展示精准匹配的结果,在展示模糊匹配的结果,这是前端还是后端的问题
网络异常,图片无法展示
|
可能部分对前端不了解的小伙伴不清楚,但是后端都是知道的数据都是存储在数据库中的,对于数据处理相关的工作,绝大部分甚至可以说全部都是由后端来完成的,所以这肯定是后端的问题了
这个时候我也在思考,怎么去完成 先精准匹配在模糊匹配 的需求,第一想法是查询两次,第一次精准匹配,第二次模糊查询然后 字段 != keyword,两次结果相加,但是又觉得肯定不是这么做的,于是开始了百度,很幸运,一次成功,在查询的时候排序进行 匹配度排序 就可以了,接下来我们讲一下什么是匹配度排序
二、初始化表数据
建表语句
CREATE TABLE `test_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 复制代码
填充数据
INSERT INTO test_user(user) values("F张三"); INSERT INTO test_user(user) values("E张三"); INSERT INTO test_user(user) values("D张三"); INSERT INTO test_user(user) values("C张三"); INSERT INTO test_user(user) values("B张三"); INSERT INTO test_user(user) values("A张三"); INSERT INTO test_user(user) values("张三"); 复制代码
网络异常,图片无法展示
|
三、常规模糊查询
我们平常使用模糊查询语句如下
select * from test_user where user like '%张三%' 复制代码
结果如下
网络异常,图片无法展示
|
根据结果我们可以看到他是以 id进行排序的,而不是精确查询在前,同时也引出了我们今天的问题,怎么对一条模糊查询语句精确查询在前模糊查询在后
四、使用 user字段进行排序
通过上面常规模糊查询可以看到,在正常的 SQL模糊查询中是按照主键 id进行升序排序的,那么接下来我们测试一下按照 name进行排序
SQL语句
select * from test_user where user like '%张三%' order by user 复制代码
查询结果
网络异常,图片无法展示
|
根据上面的查询结果我们可以看到,按照 user排序的话实际上是按照字典序进行排序
五、字符串长度排序
我们都知道,在使用下面 SQL进行模糊查询的时候,返回结果有四种形式:
select * from test_user where user like '%张三%' 复制代码
四种返回形式分别是:
- 张三
- %张三
- 张三%
- %张三%
这个时候我们对字符串长度进行排序的话就可以保证精准查询是在前面的了
SQL语句如下:
select * from test_user where user like '%张三%' order by CHAR_LENGTH( user),user 复制代码
查询结果如下
网络异常,图片无法展示
|
可以看到,我们实际上使用了两种查询,一种是以字符串长度,一种是以字典序查询,最后的结果是满足我们的预期的,先精确查询在模糊查询
六、总结
如果想要在模糊查询结果先展示精确查询在展示模糊查询内容的话,可以使用 CHAR_LENGTH来获取入参长度,将长度当做首要条件进行排序