在 mysql LIKE 查询中获取最匹配的结果
Get most matched result on top in mysql LIKE query
假设我有一个 table 这样的:
Table: businesses
+----+------------------------+
| id | name |
+----+------------------------+
| 1 | Carolyn Wong Cakes |
| 2 | Cupcakin Cackes Shop |
| 3 | Wong Cackes Shop |
| 4 | Indie Cakes & Pastries |
+----+------------------------+
我想在搜索名称中的某些词时获取 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
// 不匹配
谢谢。
它没有问题,因为它只会搜索单词。在您的情况下,您应该搜索整个字符串 Wong Cackes Shop
(或者)最好执行 FULL TEXT
搜索
以下应该可以解决问题
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 子句,因为您只对总点击数感兴趣。
为了克服空格的问题,只需在like 从句中去掉它们即可。 %wong%
将匹配 [space]wong
或 [space]wong[space]
或 wong[space]
假设我有一个 table 这样的:
Table: businesses
+----+------------------------+
| id | name |
+----+------------------------+
| 1 | Carolyn Wong Cakes |
| 2 | Cupcakin Cackes Shop |
| 3 | Wong Cackes Shop |
| 4 | Indie Cakes & Pastries |
+----+------------------------+
我想在搜索名称中的某些词时获取 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
// 不匹配
谢谢。
它没有问题,因为它只会搜索单词。在您的情况下,您应该搜索整个字符串 Wong Cackes Shop
(或者)最好执行 FULL TEXT
搜索
以下应该可以解决问题
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 子句,因为您只对总点击数感兴趣。
为了克服空格的问题,只需在like 从句中去掉它们即可。 %wong%
将匹配 [space]wong
或 [space]wong[space]
或 wong[space]