使用mysql和like语句匹配查询的完整单词

时间:2016-06-07 12:59:44

标签: mysql string wildcard sql-like names

鉴于:表'人'和字符串'bob joe'

返回:'bob a joe'行,而不是bobby joel行。

name
'bob a joe'
'ana l lee'
'bobby joel'

我想只返回bob joe,而不是bobby joel:

SELECT name FROM people 
WHERE name Like '%bob%'
AND name like '%joe%';

此代码返回bob和bobby名称。我的数据库中的名称并不总是最后一个,它们有时是第一个中间名,因此'bob%'不能解决问题。确实

SELECT name FROM people 
WHERE name LIKE '%bob %' OR name LIKE '% bob%' 
AND name LIKE '%joe %' OR name LIKE '% joe%'

会解决这个问题,但我正在寻找一个可能更容易或更好的解决方案

非常感谢 将

2 个答案:

答案 0 :(得分:0)

如果您想使用like只查找任何给定顺序的完整字词,则必须记下所有3种变体,因为start of a word中没有like的标记。所以你必须写下来

SELECT name FROM people 
WHERE (name LIKE 'bob %' OR name LIKE '% bob %' or name LIKE '% bob')
  and (name LIKE 'joe %' OR name LIKE '% joe %' or name LIKE '% joe');

涵盖所有可能性(开始,中间和结束)。

另一种(快速)可能性(除了将名称拆分为单独的列)以查找完整的单词是使用fulltext search。全文索引将允许您搜索具有innodb_ft_min_token_size(对于InnoDB)和ft_min_word_len(对于MyISAM)给出的最小长度的完整单词,您可以在配置文件中设置这些选项。对于innodb,默认值为3,对于myisam,默认值为4,因此'joe'在innodb上会很好。 (要记住的另一件事是:有一个非常常见的英语单词的禁用词表,不会包含在索引中,如'are'或'for'(全文索引通常用于索引完整句子而不是只是名称。您可以通过设置stopwords options)来更改该表。

name - 列上添加全文索引(如果更改选项,则必须重新创建索引)。

create fulltext index idx_ft_people_name on people (name);

然后使用match against查找单词

select * from people
where match(`name`) against ('+joe +bob' in boolean mode);

答案 1 :(得分:0)

伟大的答案Solarflare。我真的很喜欢你在语句上的语法,而不是我拥有它的方式,这很容易通过我的操作符(即matlab)在for循环中构建。

从技术角度来看,这条路线看起来很艰难,但如果我在第一个策略中看到很大的时间差,我就会采用它。

感谢帮助, 将