mysql: запрос анаграммы, чтобы вытащить каждое возможное слово с любыми буквами

Я нахожусь в середине создания моего запроса анаграммы, который почти отлично работает. Вот мой 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) ‹= 7 позаботится о длине, но, похоже, это не работает.

Например: СИДЕТЬ, ПАЛАТКИ, ТЕСТ

или даже слова с разницей в 1 подстановочный знак, например

TESTY (Y — подстановочный знак)

Любые идеи?


person Cesar Bielich    schedule 24.06.2013    source источник
comment
это не сработает. чтобы обрабатывать более короткие слова, вам нужно создать цепочку сложений, как указано выше, для КАЖДОЙ перестановки буквенных возможностей, для каждой потенциальной длины анаграммы, которую вы хотите. sql ОЧЕНЬ быстро превратится в ужасный беспорядок. Кроме того, если я что-то не упустил в структуре вашей таблицы, вы не вычитаете буквы. e-1 вычитает единицу из поля с именем e.   -  person Marc B    schedule 25.06.2013
comment
забыл упомянуть структуру моей таблицы, поэтому я добавил ее   -  person Cesar Bielich    schedule 25.06.2013


Ответы (2)


заполнил таблицу: anagram (word, sorted_word), где word содержит «настройка», «яблоко» и т. д., а sorted_word содержит «eginstt», «aelpp» и т. д.

чтобы найти анаграммы настроек, сначала получите отсортированное слово: select sorted_word from anagram where word = "setting", затем используйте это отсортированное слово, чтобы получить все анаграммы: select word from anagram where sorted_word = "eginstt"

вы также можете сделать это в одном запросе.

person necromancer    schedule 24.06.2013
comment
забыл упомянуть структуру моей таблицы, поэтому я добавил ее - person Cesar Bielich; 25.06.2013

Нашел для него исправление

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
person Cesar Bielich    schedule 24.06.2013