在类似mysql的查询中获得最匹配的结果
假设我有一张这样的桌子: 表:在类似mysql的查询中获得最匹配的结果,mysql,sql-like,word-boundaries,Mysql,Sql Like,Word Boundaries,假设我有一张这样的桌子: 表:业务 +----+------------------------+ | id | name | +----+------------------------+ | 1 | Carolyn Wong Cakes | | 2 | Cupcakin Cackes Shop | | 3 | Wong Cackes Shop | | 4 | Indie Cakes & Pastries | +---
业务
+----+------------------------+
| id | name |
+----+------------------------+
| 1 | Carolyn Wong Cakes |
| 2 | Cupcakin Cackes Shop |
| 3 | Wong Cackes Shop |
| 4 | Indie Cakes & Pastries |
+----+------------------------+
我想在搜索名字中的一些单词时得到最匹配的结果。
例如,我想搜索:Wong Cackes Shop
,这是3个单词。我使用此查询进行上述搜索:
SELECT * FROM businesses WHERE (
name LIKE '% Wong %' OR
name LIKE '% Cackes %' OR
name LIKE '% Shop %'
)
我希望记录3
是第一个匹配的结果,但结果是:
Carolyn Wong
//与2
匹配的单词Cupcaking Cackes Shop
//与2
匹配的单词Wong Cackes Shop
//与3
匹配的单词Wong Cackes Shop
//与3
匹配的单词Cupcaking咖啡店
Carolyn Wong蛋糕
单词边界
LIKE方法也有问题。它不会得到以三个单词中的一个开头或结尾的结果。因为中的空格
像“%word%”
例如:
Wong[space]
//不匹配[space]Wong[space]
匹配[space]Wong
//不匹配
谢谢。它做得很正确,因为它只搜索单词。在您的情况下,您应该搜索整个字符串
Wong Cackes Shop
(或者)最好实现搜索
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]
问题类似于其他问题:您看过全文索引了吗?@草莓我的表引擎是innoDB
。它支持全文吗?你把我和谷歌搞混了。你能看看编辑过的帖子吗。like查询中的空格有问题。@Bee157,在消除空格后,会产生类似“Workshop”的问题。这些词的意思不同,并将包含在搜索结果的顶部页面中。@Michael regexp应该用“Workshop”来解决问题