SQL搜索名称和最适合的排序

时间:2015-08-08 17:20:15

标签: mysql sql database search

我有一个带商店数据库的网站。我的网站的访问者能够按名称搜索商店,目前SQL查询是这样完成的:

SELECT * 
FROM tbl_shop 
WHERE LOWER(`name`) LIKE LOWER(`%text1%`) 
   OR LOWER(`name`) LIKE LOWER(`%text2%`) 
   ..... 
   OR LOWER(`name`) LIKE LOWER(`%textN%`)

这很方便,但问题是,结果没有按最佳匹配排序。一些商店名称包含非常常见的单词(例如,#34; Na Lavce")如果您输入此字符串,则所有沙龙都包含"%na%" (这很多)显示为结果。

因此,访问者可以获得许多结果,有时无法找到他正在寻找的内容,因为正确的结果是例如在第5个结果页面上。任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

SELECT * 
FROM tbl_shop 
WHERE 
       LOWER(`name`) LIKE LOWER(`%text1%`) 
   OR  LOWER(`name`) LIKE LOWER(`%text2%`) 
   ..... 
   OR  LOWER(`name`) LIKE LOWER(`%textN%`)
ORDER BY
   CASE WHEN LOWER(`name`) LIKE LOWER(`%text1%`) THEN 1 ELSE 0 END +
   CASE WHEN LOWER(`name`) LIKE LOWER(`%text2%`) THEN 1 ELSE 0 END +
   .....
   CASE WHEN LOWER(`name`) LIKE LOWER(`%textN%`) THEN 1 ELSE 0 END
   DESC

如果您想按照条款顺序排名:

ORDER BY
   CASE WHEN LOWER(`name`) LIKE LOWER(`%text1%`) THEN 1024 ELSE 0 END +
   CASE WHEN LOWER(`name`) LIKE LOWER(`%text2%`) THEN  512 ELSE 0 END +
   CASE WHEN LOWER(`name`) LIKE LOWER(`%text2%`) THEN  256 ELSE 0 END +
   .....
   CASE WHEN LOWER(`name`) LIKE LOWER(`%textN%`) THEN    1 ELSE 0 END
   DESC