2012-05-11 110 views
1

我正在學習MySQL和查詢,現在正在使用PHP開始。 爲了學習的目的,我選擇了一個小型的anagram求解器類型的項目開始。 我在互聯網上發現了一個非常古老的英語單詞列表,可以免費用作數據庫。 我試過查詢,找到集合和全文搜索匹配,但失敗。mysql:按字母匹配查詢字母

如何我:

賽的字母結果信?

例如,假設我將字母S-L-A-O-G與數據庫條目匹配。

因爲我有這肯定包含了很多的話一個龐大的數據庫,我想在查詢的回報:

lag 
goal 
goals 
slag 
log 
... and so on. 

不具有可能有兩次使用了一封信任何其他結果。

我該如何解決這個問題?

非常感謝您的時間。

+0

不認爲你可以只用SQL我。你更有可能獲取所有記錄並處理PHP方面的問題。 – Shoe

+0

嘗試使用LIKE運算符:http://www.w3schools.com/sql/sql_like.asp – Onheiron

+0

我不知道任何全文是這樣做的...... Google都沒有......所以它必須被硬編碼... – shadyyx

回答

1
$str_search = 'SLAOG'; 

SELECT word 
FROM table_name 
WHERE word REGEXP '^[{$str_search}]+$' # '^[SLAOG]+$' 

// Filter the results in php afterwards 

// Loop START 

$arr = array(); 
for($i = 0; $i < strlen($row->word); $i++) { 

    $h = substr($str_search, $i, 0); 
    preg_match_all("/{$h}/", $row->word, $arr_matches); 
    preg_match_all("/{$h}/", $str_search, $arr_matches2); 

    if (count($arr_matches[0]) > count($arr_matches2[0])) 
     FALSE; // Amount doesn't add up 

} 

// Loop END 

對給定單詞基本運行REGEXP,並根據單詞與搜索單詞相比的出現次數來篩選結果。

REGEXP使用給定單詞的組合從頭到尾檢查所有列。這可能會導致更多的行,然後你需要,但它會給一個很好的過濾器。

循環部分用於在搜索字符串中過濾使用多個字母的位置。我在每個字母上運行一個preg_match_all()找到單詞和搜索詞來檢查發生的數量,並與count()進行比較。

+0

謝謝@robin。我根本不知道那個正則表達式可以作爲SQL查詢來執行。你可以請解釋一下在查詢和php代碼中的正則表達式嗎?非常感謝你。 – Phil

+0

添加了更多解釋。 –

0

,因爲你只想給定的字母,並沒有其他人的話,但你不需要使用所有的字母,那麼我建議的邏輯是這樣的:

* take your candidate word, 
* do a string replace of the first occurrence of each letter in your match set, 
* set the new value to null 
* then finally wrap all that in a strlength to see if there are any characters left. 

你可以做所有在SQL - 但是對於大多數編碼人員來說,一個小程序可能會更加熟悉。

1

如果你想快速和骯髒的解決方案....

分割你正在試圖獲得字謎換入單個字母的單詞。爲每個字母分配一個單獨的素數值,並將它們全部相乘;例如:

C - 2 
A - 3 
T - 5 

共30

然後通過你的詞典列表步驟,並且做,每個字相同的操作。如果您的目標單詞的值可以完全由字典單詞的值整除,那麼您知道字典單詞只有在目標單詞中出現的字母。

您可以通過預先計算的字典中的值,然後查詢了正確的價值觀加速這一過程: SELECT * FROM字典WHERE($ searchWordTotal%wordTotal)= 0 (searchWordTotal是總的字你要找的,和wordTotal是從數據庫中一個)

我應該避開寫的這些天這個正確的....

+0

非常聰明。 :)但爲什麼測試一個部門的其餘部分,爲什麼不只是'WHERE $ searchWordTotal = wordTotal'? – ZeroOne

+1

如果你想找到重用所有字母的正確字母,那麼是的,你會尋找匹配的字母;但海報也希望返回由某些字母組成的單詞,在這種情況下,您需要進行模數檢查。 現在我需要做的是找出如何輕鬆找到由多個單詞組成的字謎,沒有很多討厭的編碼.... – andrewsi

+0

其實...當這個例程完成時,我會列出一個列表這些詞是主詞的部分變體。所以如果一個單詞不完全匹配,我可以計算出我仍然需要查找哪些字母,然後搜索我剛剛爲具有這些字母的單詞生成的列表。最重要的是,我甚至可以遞歸地做到這一點,所以它會選擇多個單詞。所以搜索TIGER會發現ERG;然後我可以在列表中搜索與TI匹配的詞並找到它。爲什麼我會覺得我將在週末花這個代碼呢? – andrewsi