我正在进行一个项目,该项目要求用户搜索某些类别的产品。产品有标签,如: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);
第一个查询得到的是精确匹配,第二个查询得到的是按喜欢排序的匹配。