按 "Best Match" SQL 对结果进行排序



我正在进行一个项目,该项目要求用户搜索某些类别的产品。产品有标签,如:t恤,套头衫,帽子,我目前正在显示按点赞数量排序的结果。下面是我的SQL语句:

SELECT * 
FROM products 
WHERE keywords LIKE '%$query%' 
ORDER BY likes DESC LIMIT 50;

但是问题是如果假设有人搜索了"hat"但一个更流行的词是"话匣子"。在数据库中,它会首先出现,因为它有更多的"赞"。

所以把它放在伪代码中:

SELECT * 
FROM products 
WHERE keywords LIKE '%$query%' 
ORDER BY "BEST MATCH" LIMIT 50;

,理想的结果是:

2结果:
帽子: 26个赞,
ChatTerbox: 234个赞,

代替:

2结果:
C帽子terbox: 234个赞
帽子: 26个赞,

那么有办法做到这一点吗?

ORDER BY子句中首先检查是否有精确匹配,或者(如果您想要的话)keywords'$query'开头:

SELECT * 
FROM products 
WHERE keywords LIKE '%$query%' 
ORDER BY keywords = '$query' DESC, -- 1st keywords with exact match
keywords LIKE '$query%' DESC, -- 2nd keywords which start with '$query'    
likes DESC -- 3d likes
LIMIT 50;

你可以试试:

(SELECT * FROM products WHERE keywords LIKE '$query')
union
(SELECT * FROM products WHERE keywords LIKE '%$query%' order by likes desc LIMIT 50);

第一个查询得到的是精确匹配,第二个查询得到的是按喜欢排序的匹配。

最新更新