首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mysql查询中获得最匹配的结果

在mysql查询中获得最匹配的结果
EN

Stack Overflow用户
提问于 2016-11-14 14:52:40
回答 2查看 1.7K关注 0票数 1

假设我有一张这样的桌子

表:businesses

代码语言:javascript
复制
+----+------------------------+
| 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个单词。

我将此查询用于上面的搜索:

代码语言:javascript
复制
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类方法也有问题。它不会得到以三个单词中的一个开头或结尾的结果。因为spacesLIKE '% word %'

例如:

Wong[space] //不匹配

[space]Wong[space]匹配

[space]Wong //不匹配

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-14 14:58:06

如下所示应能奏效

代码语言:javascript
复制
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]

票数 3
EN

Stack Overflow用户

发布于 2016-11-14 14:55:26

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40591568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档