MySQL 关键字模糊匹配按照匹配度排序

Myth丶恋晨 2024-03-27 12:46 192阅读 0赞

MySQL 关键字模糊匹配,并按照匹配度排序。

方式一、按照关键字搜索,然后根据关键字所占比例排序

  1. SELECT
  2. drug_name,
  3. pinyin
  4. FROM
  5. tbl_drug
  6. WHERE
  7. pinyin LIKE '%AM%'
  8. ORDER BY
  9. LENGTH(pinyin);

效果如下

32431ee766b904e44ddd0625e6d82c29.jpeg

方式二、将关键字开头记录排序在前

  1. SELECT
  2. drug_name,
  3. pinyin
  4. FROM
  5. tbl_drug
  6. WHERE
  7. pinyin LIKE 'AM%'
  8. UNION
  9. SELECT
  10. drug_name,
  11. pinyin
  12. FROM
  13. tbl_drug
  14. WHERE
  15. pinyin LIKE '%AM%';

效果如下

095b47abd27e79c5a32fac1d0caaa7cb.jpeg

方式三、将关键字开头排序在前,再根据匹配度排序记录

  1. SELECT
  2. drug_name,
  3. pinyin
  4. FROM
  5. (SELECT
  6. drug_name,
  7. pinyin
  8. FROM
  9. tbl_drug
  10. WHERE
  11. pinyin LIKE 'AM%'
  12. ORDER BY
  13. LENGTH(pinyin)
  14. LIMIT 999999) t1
  15. UNION
  16. SELECT
  17. drug_name,
  18. pinyin
  19. FROM
  20. (SELECT
  21. drug_name,
  22. pinyin
  23. FROM
  24. tbl_drug
  25. WHERE
  26. pinyin LIKE '%AM%'
  27. ORDER BY
  28. LENGTH(pinyin)
  29. LIMIT 999999) t2
  30. LIMIT 0,20;

结果如下,这块中文 “()” 所占长度较大。在此有一个问题,子查询的排序无效,如果子查询中 order by 不带 limit,会被优化器干掉

42a61c96aba009fa8fce4f200b51e116.jpeg

以上方式为网上整理总结,下面这个方式为个人改进

方式四、先根据关键字所在字段 index 排序,然后再根据匹配度排序

  1. SELECT
  2. drug_name,
  3. pinyin
  4. FROM
  5. tbl_drug
  6. WHERE
  7. pinyin LIKE '%AM%'
  8. ORDER BY
  9. LENGTH(substring_index(pinyin,'AM',1)),
  10. LENGTH(pinyin)
  11. LIMIT 0,20

效果如下

f6497b8212be04e035d5eda18703a0e9.jpeg

延伸版:

  1. SELECT
  2. drug_name,
  3. pinyin
  4. FROM
  5. tbl_drug
  6. WHERE
  7. LOCATE( "阿", pinyin ) > 0
  8. OR LOCATE( "阿", drug_name ) > 0
  9. ORDER BY
  10. LOCATE( "阿", pinyin ),
  11. LOCATE( "阿", drug_name ),
  12. LENGTH( pinyin );

结果如下:

180b065396433c1cb38e7c0061ea54fc.jpeg

发表评论

表情:
评论列表 (有 0 条评论,192人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Mysql匹配排序

    简言: 我们在用Mysql进行模糊查询的时候,Mysql自己做不到按照匹配度去排序,那么要按匹配度排序的话,我们自己要自己对sql进行改造 正常模糊查询sql如下