按 "Best Match" SQL 排序结果

Order results by "Best Match" SQL

我正在开展一个项目,该项目要求用户搜索特定类别的产品。这些产品有标签,例如:T 恤、套头衫、帽子,我目前显示的是按点赞数排序的结果。这是我的 SQL 声明:

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

但问题是,如果假设有人搜索“帽子”,但数据库中更流行的词是“话匣子”,它会首先出现,因为它有更多的喜欢。

所以把它放在伪代码中:

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

理想的结果是:

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

而不是:

2 个结果:
Chatterbox : 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);

对于第一个查询,您将获得完全匹配,对于第二个,其他查询将按喜欢的顺序进行匹配。