MySQL模糊查询 先展示精确查询在展示模糊查询结果 | 结果按匹配度 排序

959 阅读3分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第6篇文章,点击查看活动详情

一、前言

今天在团结友爱的日更群里出现了下图的问题,关键词输入后优先展示精准匹配的结果,在展示模糊匹配的结果,这是前端还是后端的问题

image.png

可能部分对前端不了解的小伙伴不清楚,但是后端都是知道的数据都是存储在数据库中的,对于数据处理相关的工作,绝大部分甚至可以说全部都是由后端来完成的,所以这肯定是后端的问题了

这个时候我也在思考,怎么去完成 先精准匹配在模糊匹配 的需求,第一想法是查询两次,第一次精准匹配,第二次模糊查询然后 字段 != 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("张三");

image.png

三、常规模糊查询

我们平常使用模糊查询语句如下

select * from test_user where user like '%张三%'

结果如下

image.png

根据结果我们可以看到他是以 id进行排序的,而不是精确查询在前,同时也引出了我们今天的问题,怎么对一条模糊查询语句精确查询在前模糊查询在后

四、使用 user字段进行排序

通过上面常规模糊查询可以看到,在正常的 SQL模糊查询中是按照主键 id进行升序排序的,那么接下来我们测试一下按照 name进行排序

SQL语句

select * from test_user where user like '%张三%' order by user

查询结果

image.png

根据上面的查询结果我们可以看到,按照 user排序的话实际上是按照字典序进行排序

五、字符串长度排序

我们都知道,在使用下面 SQL进行模糊查询的时候,返回结果有四种形式:

select * from test_user where user like '%张三%'

四种返回形式分别是:

  • 张三
  • %张三
  • 张三%
  • %张三%

这个时候我们对字符串长度进行排序的话就可以保证精准查询是在前面的了

SQL语句如下:

select * from test_user where user like '%张三%' order by CHAR_LENGTH( user),user

查询结果如下

image.png

可以看到,我们实际上使用了两种查询,一种是以字符串长度,一种是以字典序查询,最后的结果是满足我们的预期的,先精确查询在模糊查询

六、总结

如果想要在模糊查询结果先展示精确查询在展示模糊查询内容的话,可以使用 CHAR_LENGTH来获取入参长度,将长度当做首要条件进行排序

参考资料:MySQL模糊查询 结果按匹配度 排序




本文内容到此结束了

如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。

如有错误❌疑问💬欢迎各位大佬指出。

我是 宁轩 , 我们下次再见