假设我有一个这样的表:
表:businesses
+----+------------------------+
| id | name |
+----+------------------------+
| 1 | Carolyn Wong Cakes |
| 2 | Cupcakin Cackes Shop |
| 3 | Wong Cackes Shop |
| 4 | Indie Cakes & Pastries |
+----+------------------------+
当我在name里面搜索一些单词时,我想得到best matched result
。例如,我想搜索:Wong Cackes Shop
,这是3个单词。
我使用这个查询上面的搜索:
SELECT * FROM businesses WHERE (
name LIKE '% Wong %' OR
name LIKE '% Cackes %' OR
name LIKE '% Shop %'
)
我期望record 3
是第一个匹配的结果,但结果是:
-
Carolyn Wong Cakes
//2
匹配字 -
Cupcaking Cackes Shop
//2
匹配字 -
Wong Cackes Shop
//3
匹配字
如何搜索单词并在其他结果之上获得最匹配结果的记录?
像这样:
-
Wong Cackes Shop
//3
匹配字 -
Cupcaking Cackes Shop
-
Carolyn Wong Cakes
word-boundaries
LIKE方法也有一个问题。它不会得到以3个单词开头或结尾的结果。因为LIKE '% word %'
中的spaces
例如:
Wong[space]
//不匹配[space]Wong[space]
匹配[space]Wong
//不匹配
谢谢。
下面的内容就可以了
SELECT
name,
(( name LIKE '%Wong%')+( name LIKE '%Cackes%') +(name LIKE '%Shop%')) as total
FROM businesses WHERE (
name LIKE '%Wong%' OR
name LIKE '%Cackes%' OR
name LIKE '%Shop%'
)
ORDER BY total DESC
您甚至可以删除这里的where子句,因为您只对总命中数感兴趣。
为了克服空格的问题,只要在类似子句中去掉空格即可。%wong%
将匹配[space]wong
或[space]wong[space]
或wong[space]
这是正确的,因为它将只搜索单词。在您的情况下,您应该搜索整个字符串Wong Cackes Shop
(OR)最好实现FULL TEXT
搜索