按 "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);
对于第一个查询,您将获得完全匹配,对于第二个,其他查询将按喜欢的顺序进行匹配。
我正在开展一个项目,该项目要求用户搜索特定类别的产品。这些产品有标签,例如: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);
对于第一个查询,您将获得完全匹配,对于第二个,其他查询将按喜欢的顺序进行匹配。