我有一个带商店数据库的网站。我的网站的访问者能够按名称搜索商店,目前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个结果页面上。任何想法如何解决这个问题?
答案 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