Запрос, в котором сумма указанных столбцов (всех целых) в строке меньше указанного целого

Я пишу программу поиска слов.

Моя база данных настроена на MyISAM
с одной таблицей (словами) структурированной

WordID | String | A | B | ... | Z |
------------------------------------
int     varchar int  int ...  int

Где значения для столбцов A — Z — это количество вхождений этой буквы в строку.

Чтобы написать запрос, чтобы найти все возможные слова, составленные из указанного (но динамического — выбранного пользователем) набора символов (включая дикие символы), то есть: "Bu!!er" должен вернуться, но, приклад, бык и т. д.

куда

 S is the set of characters specified that we can use
W is the set of characters in a word

Мне нужно запросить базу данных для всех строк, где

 # of occurences in the word for each specified character (not including "!") is less than number of occurrences of that character in the specified string
W_k < S_k where k is each character specified

А ТАКЖЕ

# of occurrences of letters not specified in the specified string are in SUM less than the total occurrences of the wildcard character ("!") in the specified string
W_q < S_! where q is each character not specified and S_! total amount of occurrences of "!".

Для первой части WHERE заявление (W_k < S_k)
За bu!!er заявление будет

 `B` <= 1 AND `U` <= 1 AND `E` <= 1 AND `R` <= 1

И для второй части

 `A` + `C` + `D` + ... + `Z` <= 2

Полный, где часть запроса становится

  ( ( `A` + (IF(`B`-1 < 0, 0, `B`-1)) + `C` + `D` + (IF(`E`-1 < 0, 0, `E`-1)) + `F` + `G` + `H` + `I` + `J` + `K` + `L` + `M` + `N` + `O` + `P` + `Q` + (IF(`R`-1 < 0, 0, `R`-1)) + `S` + `T` + (IF(`U`-1 < 0, 0, `U`-1)) + `V` + `W` + `X` + `Y` + `Z` ) <= 2 )

Есть ли лучший способ сделать это, чем это?

0

Решение

 `A` + `C` + `D` + ... + `Z`

Использовать денормализацию? Храните полную длину в отдельном столбце.

 `TOTAL` <= 5

В качестве обозначения:

Ваша схема слишком сильно ограничивает возможные запросы — хотя этого достаточно для этой работы. Возможно, лучше хранить все слова в памяти (по одному на экземпляр сервера) и выполнять «полное сканирование таблицы» или «индексированное сканирование» для слов.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]