选择包含某些字符的MYSQL数据(单词)

时间:2019-07-20 10:01:59

标签: mysql sql regex

我在MYSQL表中有一个字典,该表包含240000个单词。例如,如果我有字母 G I G S N O 我想在表格中选择包含所有或部分这些字母(而没有其他字母)的所有单词。

可接受的单词包括:

  • 歌曲
  • 儿子
  • 如此

不可接受的单词示例:

  • 歌曲(超出允许的范围一秒)
  • 单词长于字符数(在这种情况下为6个字符)

MYSQL查询是什么样的?

我当前的MYSQL看起来像:

SELECT * FROM `list` 
WHERE word like '%S%' and word like '%O%' and word like '%G%'

我想使用6或7个字母并找到以下单词:

  • 等长
  • 更短

现在,我只找到长度相等或更长的单词,并且还包含其他字母。

1 个答案:

答案 0 :(得分:1)

这是一个起点:

(我会坚持要求您根据所需字母来构造查询。)

如果该列只有一个单词:

WHERE word REGEXP '^[GISNO]+$'

如果该列可以包含多个单词,则将在8.0版之前选择行(而不是单词):

WHERE word REGEXP '[[:<:]][GISNO]+[[:>:]]'

或者,对于8.0:

WHERE word REGEXP '\b[GISNO]+b'

现在过滤掉每个字母“太多”。 (我认为该词本身就是该列。)

  AND word NOT REGEXP 'G.*G.*G'   -- max of 2 Gs
  AND word NOT REGEXP 'I.*I'      -- max of 1 I
  AND word NOT REGEXP 'O.*O'      -- max of 1 O
  AND word NOT REGEXP 'S.*S'      -- max of 1 S

另一种方法是用字母按字母顺序增加一列。

going   ggino
song    gnos
son     nos
so      os
on      no
no      no   -- note the dup in the new column

现在测试变为

WHERE sorted_word REGEXP '^g{0,2}i?n?o?s?$'

这应该运行得更快。

使用此技巧,其他一些事情可能会运行得更快。