SQL模糊查詢排序問題

需求描述

  • 查詢表中名字帶指定關鍵字的數據
  • 完全匹配放在第一位
  • 前匹配放在第二位
  • 末尾匹配放在第三位
  • 中間匹配放在第四位

建表

DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
  `id` varchar(20) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  `password` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

初始數據

insert into t_user values(1,'汪峰','888888');
insert into t_user values(2,'王汪峰','888888');
insert into t_user values(3,'汪峰峰','888888');
insert into t_user values(4,'歐陽汪峰','888888');
insert into t_user values(5,'王汪峰峰','888888');

直接like查詢

select * from t_user where name like '%汪峰%';

結果為:

01.png

可以發現,“汪峰峰”并沒有排列在“王汪峰”前面

使用case when進行輔助排序

select * from t_user f where f.name like '%汪峰%' order by 
(case
when f.name = '汪峰' then 1 
when f.name like '汪峰%' then 2
when f.name like '%汪峰' then 3
when f.name like '%汪峰%' then 4  
else 0
end ) limit 0,50;

查詢結果為:

02.png

等于說額外添加了一個虛擬列,來輔助進行排序;
首先匹配完全==的,然后再按照規則匹配下一條數據,就能得到我們想要的結果了。

備注

如果排序后,需要按照中文拼音的順序繼續排序,需要加上:

CONVERT(f.name USING gbk) COLLATE gbk_chinese_ci
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容