2
create table tbl (
  id int,
  comment varchar(255),
  primary key (id)
);

insert into tbl (id, comment) values ('1', 'dumb,');
insert into tbl (id, comment) values ('2', 'duuumb,');
insert into tbl (id, comment) values ('3', 'dummb');
insert into tbl (id, comment) values ('4', 'duummb');
insert into tbl (id, comment) values ('5', 'very dumb person');

select comment, soundex(comment) 
from tbl;

结果:

+------------------+------------------+
| comment          | soundex(comment) |
+------------------+------------------+
| dumb,            | D510             |
| duuumb,          | D510             |
| dummb            | D510             |
| duummb           | D510             |
| very dumb person | V6351625         |
+------------------+------------------+

我想在该字段的任何位置找到所有包含“哑”的行,包括所有拼写错误和变体。

select comment 
from tbl
where soundex(comment) like '%D510%'

这未能得到最后一行#5,我怎样才能得到那一行?如果有比 soundex() 更好的解决方案,那很好。

4

3 回答 3

4

这将适用于您的特定示例:

select comment 
from tbl
where soundex(comment) like '%D510%' or comment like '%dumb%';

它不会在评论中发现拼写错误。

编辑:

你可以这样做:

select comment
from tbl
where soundex(comment) = soundex('dumb') or
      soundex(substring_index(substring_index(comment, ' ', 2), -1)  = soundex('dumb') or
      soundex(substring_index(substring_index(comment, ' ', 3), -1)  = soundex('dumb') or
      soundex(substring_index(substring_index(comment, ' ', 4), -1)  = soundex('dumb') or
      soundex(substring_index(substring_index(comment, ' ', 5), -1)  = soundex('dumb');

有点蛮力。

这样做的需要表明您应该考虑全文索引。

于 2014-02-13T21:45:53.170 回答
0

你可以试试 MySQL REGEXP吗?是在文本中查找特定单词的好方法。

您可以使用[[:<:]][[:>:]]作为单词边界:

SELECT comment FROM tbl WHERE comment REGEXP '[[:<:]]dumb[[:>:]]'
于 2014-02-13T21:40:27.337 回答
0

假设您想要整个字段而不仅仅是匹配元素,那么这应该可以工作,因为 soundex 永远不会在另一个元素的中间找到一个元素;

从 tbl 中选择评论 where (soundex(comment) like '%D510%' or comment like '%d%mb')

编辑改变了像U是其他东西的情况一样,即Damb,它给出了D510的soundex

于 2014-02-13T21:50:33.210 回答