2015-10-29 19 views
0

我正在編寫一個單詞搜索程序。查詢行中指定列(所有整數)的總和小於指定的整數

我的數據庫是建立在MyISAM 一個表(字)結構化

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

其中用於列的值 - 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) 

有沒有比這更好的方法呢?

+1

是的。假設數據庫甚至是適當的解決方案,請參閱規範化。數據庫表格不是電子表格。 – Strawberry

+0

還有什麼其他解決方案?現在正在研究正常化。謝謝。 –

+0

好吧,搜索拼字遊戲算法可能會提供一些其他的想法。 – Strawberry

回答

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

使用非規格化?將全長存儲在單獨的列中。

`TOTAL` <= 5 

一點題外話:

你的架構限制了可能出現的問題太多了 - 雖然這足以讓這項工作。將所有單詞保存在內存中(每個服務器實例一個)可能會更好,並對單詞執行「全表掃描」或「索引掃描」。

+0

存儲全長的問題在於''A' +'C' +'D' + ... +'Z' - 這些是用戶沒有指定的字符,所以它們根據用戶的輸入而改變每一次。你爲什麼說它限制了可能的查詢?謝謝你的時間 –

+0

它不能解決這些類型的查詢,但我認爲它解決了你的*原始*問題:「要編寫一個查詢來查找由指定的一組字符(包括通配符)組成的所有可能的單詞, 」。所以我建議的是查詢的第二部分。 –

+0

Gotcha。在那種情況下,我看到它會如何工作。我應該更清楚。 –

相關問題