我在MYSQL表中有一个字典,该表包含240000个单词。例如,如果我有字母 G , I , G , S , N 和 O 我想在表格中选择包含所有或部分这些字母(而没有其他字母)的所有单词。
可接受的单词包括:
不可接受的单词示例:
MYSQL查询是什么样的?
我当前的MYSQL看起来像:
SELECT * FROM `list`
WHERE word like '%S%' and word like '%O%' and word like '%G%'
我想使用6或7个字母并找到以下单词:
现在,我只找到长度相等或更长的单词,并且还包含其他字母。
答案 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?$'
这应该运行得更快。
使用此技巧,其他一些事情可能会运行得更快。