在 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 是第一个匹配的结果,但结果是:

  1. Carolyn Wong Cakes // 与 2 个匹配词
  2. Cupcaking Cackes Shop // 与 2 个匹配词
  3. Wong Cackes Shop // 有 3 个匹配词

我如何搜索词并在其他结果之上获得最匹配结果的记录?

像这样:

  1. Wong Cackes Shop // 有 3 个匹配词
  2. Cupcaking Cackes Shop
  3. 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]