代码之家  ›  专栏  ›  技术社区  ›  davidjhp

在MySQL中,如何编写SQL来搜索字段中的单词?

  •  2
  • davidjhp  · 技术社区  · 10 年前
    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         |
    +------------------+------------------+
    

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

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

    这无法获得最后一行#5,我如何也获得该行? 如果有比soundex()更好的解决方案,那就好了。

    3 回复  |  直到 10 年前
        1
  •  4
  •   Gordon Linoff    10 年前

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

    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');
    

    有点暴力。

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

        2
  •  0
  •   user4018366 user4018366    10 年前

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

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

    SELECT comment FROM tbl WHERE comment REGEXP '[[:<:]]dumb[[:>:]]'
    
        3
  •  0
  •   Steve    10 年前

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

    选择注释 来自tbl 其中(soundex(注释)如“%D510%”或注释如“%d%mb”)

    编辑更改类似于U是其他东西的情况,例如Damb,其音值为D510