按“最佳匹配”sql排序结果

6psbrbz9  于 2021-09-29  发布在  Java
关注(0)|答案(2)|浏览(451)

我正在做一个项目,需要用户搜索特定类别的产品。这些产品有标签,如:t恤、套头衫、帽子,我目前正在显示按喜欢数量排序的结果。下面是我的sql语句:

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

但问题是,如果有人搜索了“hat”,但数据库中更流行的词是“chatterbox”,那么它会首先找到这个词,因为它有更多的喜好。
因此,将其放在伪代码中:

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

理想的结果是:
2结果:
帽子:26个喜欢,
chatterbox:234喜欢,
而不是:
2结果:
chatterbox:234喜欢,
帽子:26个喜欢,
有没有办法做到这一点?

vpfxa7rd

vpfxa7rd1#

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;
bvpmtnay

bvpmtnay2#

您可以尝试以下方法:

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

使用第一个查询,您可以得到精确的匹配,而使用第二个查询,其他查询则按照喜欢的顺序进行匹配。

相关问题