假设我有一张这样的桌子:
表: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//with2匹配单词
Cupcaking Cackes Shop//with2匹配单词
Wong Cackes Shop//with3匹配单词
我怎样才能搜索单词并在其他结果的基础上获得匹配结果最多的记录?
这样地:
Wong Cackes Shop//with3匹配单词
Cupcaking Cackes Shop
Carolyn Wong Cakes
编辑:我的word-boundaries类方法也有问题。它不会得到以三个单词中的一个开头或结尾的结果。因为那些spaces中的LIKE '% word %'
例如:
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子句,因为你只是对点击总数感兴趣。
为了克服空格的问题,只需在like子句中去掉它们。%wong%将匹配[space]wong[space]wong[space]wong[space]

关于mysql - 在mysql LIKE查询中获得最匹配的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40591568/

10-13 06:31