1

假设我有一张这样的桌子:

桌子: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-boundariesLIKE 方法也有问题。它不会得到以 3 个单词之一开头或结尾的结果。因为 例如:spaces//不匹配匹配//不匹配LIKE '% word %'

Wong[space]
[space]Wong[space]
[space]Wong

谢谢。

4

2 回答 2

2

以下应该可以解决问题

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]wongOR[space]wong[space]wong[space]

于 2016-11-14T14:58:06.767 回答
0

它做得正确,因为它只会搜索这个词。在您的情况下,您应该搜索整个字符串Wong Cackes Shop(OR)最好是实现FULL TEXT搜索

于 2016-11-14T14:55:26.143 回答