mysql:Anagram查询用任何字母拉出每个可能的单词

时间:2013-06-24 21:48:57

标签: mysql anagram

我正在构建我的anagram查询,这几乎是非常好用的。这是我的sql

我使用的字母是“settin?”

不同之处在于我将允许用户添加“?”的通配符。进入该领域。

SELECT `word`, 0+ABS(`e`-1)+ABS(`i`-1)+ABS(`n`-1)+ABS(`s`-1)+ABS(`t`-2) AS difference
FROM `TWL06`
WHERE LENGTH(`word`) <= 7
HAVING difference <= 1

我的表格结构为

word | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
--------------------------------------------------------------------------------------------------------------
THIS | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |

查询的问题在于它只会拉出包含所有字母的单词,这些单词的差值为0或1.它不会拉长度较小的单词,可能包含一些字母或较短的单词,如2 3 4 5 6个字母。

我认为WHERE LENGTH(word)&lt; = 7会照顾长度,但这似乎不起作用。

对于实例:SIT,TENTS,TEST

或者甚至是带有1个通配符的单词,如

TESTY(Y是通配符)

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

填充了一个表:anagram (word, sorted_word)其中word包含“setting”,“apple”等,而sorted_word包含“eginstt”,“aelpp”等。

要查找设置字谜,首先获取已排序的字词:select sorted_word from anagram where word = "setting"然后使用该有序字词获取所有字谜:select word from anagram where sorted_word = "eginstt"

你也可以在一个查询中完成。

答案 1 :(得分:0)

找到了解决方法

SELECT
    `word`,
    0+IF(`a` > 0, `a` - 0, 0)
    +IF(`b` > 0, `b` - 0, 0)
    +IF(`c` > 0, `c` - 0, 0)
    +IF(`d` > 0, `d` - 0, 0)
    +IF(`e` > 1, `e` - 1, 0)
    +IF(`f` > 0, `f` - 0, 0)
    +IF(`g` > 0, `g` - 0, 0)
    +IF(`h` > 0, `h` - 0, 0)
    +IF(`i` > 1, `i` - 1, 0)
    +IF(`j` > 0, `j` - 0, 0)
    +IF(`k` > 0, `k` - 0, 0)
    +IF(`l` > 0, `l` - 0, 0)
    +IF(`m` > 0, `m` - 0, 0)
    +IF(`n` > 1, `n` - 1, 0)
    +IF(`o` > 0, `o` - 0, 0)
    +IF(`p` > 0, `p` - 0, 0)
    +IF(`q` > 0, `q` - 0, 0)
    +IF(`r` > 0, `r` - 0, 0)
    +IF(`s` > 1, `s` - 1, 0)
    +IF(`t` > 2, `t` - 2, 0)
    +IF(`u` > 0, `u` - 0, 0)
    +IF(`v` > 0, `v` - 0, 0)
    +IF(`w` > 0, `w` - 0, 0)
    +IF(`x` > 0, `x` - 0, 0)
    +IF(`y` > 0, `y` - 0, 0)
    +IF(`z` > 0, `z` - 0, 0) AS difference
FROM `TWL06`
WHERE LENGTH(`word`) <= 8
HAVING difference <= 2