MySQL 关键字模糊匹配,并按照匹配度排序。sql
方式1、按照关键字搜索,而后根据关键字所占比例排序优化
SELECT drug_name, pinyin FROM tbl_drug WHERE pinyin LIKE '%AM%' ORDER BY LENGTH(pinyin);
效果以下code
方式2、将关键字开头记录排序在前blog
SELECT drug_name, pinyin FROM tbl_drug WHERE pinyin LIKE 'AM%' UNION SELECT drug_name, pinyin FROM tbl_drug WHERE pinyin LIKE '%AM%';
效果以下排序
方式3、将关键字开头排序在前,再根据匹配度排序记录string
SELECT drug_name, pinyin FROM (SELECT drug_name, pinyin FROM tbl_drug WHERE pinyin LIKE 'AM%' ORDER BY LENGTH(pinyin) LIMIT 999999) t1 UNION SELECT drug_name, pinyin FROM (SELECT drug_name, pinyin FROM tbl_drug WHERE pinyin LIKE '%AM%' ORDER BY LENGTH(pinyin) LIMIT 999999) t2 LIMIT 0,20;
结果以下,这块中文“()”所占长度较大。在此有一个问题,子查询的排序无效,若是子查询中order by 不带limit,会被优化器干掉it
以上方式为网上整理总结,下面这个方式为我的改进class
方式4、先根据关键字所在字段index排序,而后再根据匹配度排序搜索
SELECT drug_name, pinyin FROM tbl_drug WHERE pinyin LIKE '%AM%' ORDER BY LENGTH(substring_index(pinyin,'AM',1)), LENGTH(pinyin) LIMIT 0,20
效果以下im
延伸版:
SELECT drug_name, pinyin FROM tbl_drug WHERE drug_name LIKE '%阿%' OR pinyin LIKE '%阿%' ORDER BY LOCATE( "阿", pinyin ), LOCATE( "阿", drug_name ), LENGTH( pinyin );
结果以下: