鉴于:表'人'和字符串'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%'
会解决这个问题,但我正在寻找一个可能更容易或更好的解决方案
非常感谢 将
答案 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循环中构建。
从技术角度来看,这条路线看起来很艰难,但如果我在第一个策略中看到很大的时间差,我就会采用它。
感谢帮助, 将