2012-07-24 53 views
1

我正在嘗試在php mysql中爲謎語發現者編寫一個程序..我有數據庫中只有一個字段名爲'word'的字典,它包含500000行。謎語發現者程序php mysql

通過使用PHP我試圖通過一個從數據庫拉詞之一..得到一個字我for循環創建2,其由字符比較進行字符後..

例如..讓輸入字是' ABCDEF」 ..

考慮我正在取字‘從數據庫褪色’..

我寫一個循環,並檢查字褪色是否在ABCDEF ..如果是的,我打印的字..如果不是,我會從數據庫取下一個單詞..

我寫的代碼..但我得到一個空白頁作爲輸出..請幫助..

我還有一個問題。有沒有其他的方式來找到一個字的子串,而不是使用字符逐字比較?

例如:如果我的輸入是fedcba ..我把它排序爲abcdef .. 和字典單詞是淡入淡出,我排序爲adef ..是任何函數來查找adef是abcdef的子字符串..

+1

「我寫了代碼..」你的代碼是什麼? – 2012-07-24 06:20:23

回答

1

忘記檢查PHP中的每個單詞。這是一個CPU的噩夢!

在您的表格中添加第二列,並按字母順序拼寫出單詞。例如:

Word : AlphaWord 
Test : estt 

然後你可以簡單的運行這樣的查詢:

select word from table 1 where AlphaWord = (select AlphaWord from table1 where word='$yourWord') order by word asc; 

編輯:如果你不想匹配換句話說之內的話,你可以在彈出一個全文搜索索引AlphaWord列,然後使用Match()... against()語法,它將非常快速地返回匹配結果。但是,由於此運算符只允許將通配符放在搜索字符串的末尾,因此它不會與machete->aceehmtache->aceh匹配。話雖如此,說實話,你不可能真的在通常的搜索中添加一個匹配它們的通配符。

+0

打敗我吧。如果您希望程序以毫秒爲單位而不是以分鐘爲單位進行響應,那肯定會好得多。還要記住添加AlphaWord列作爲索引,以便查找速度更快。 'ALTER TABLE [tablename] ADD INDEX AlphaWord(AlphaWord);' – Tom 2012-07-24 06:34:31

+0

認爲我的單詞是abcdef ..現在內部查詢將獲取所有AlphaFord行,'abcdef'並將被傳遞到外部查詢和單詞將被檢索..但abcd這個詞也是abcdef的一個字謎。對?我想獲取可以從abcdef – srinath 2012-07-24 06:46:51

+0

呀形成的所有單詞。正如你所說,在我的程序中條件與aceh不匹配。任何其他方法? – srinath 2012-07-24 19:34:32

1

您必須編寫自己的用戶定義函數來得到的字母排序的字符串:

CREATE FUNCTION fn_sort_string(arg_word VARCHAR(255)) RETURNS VARCHAR(255) 
BEGIN 
    DROP TEMPORARY TABLE IF EXISTS temp; 
    CREATE TEMPORARY TABLE temp(letter CHAR(1)); 

    SET @var_counter = 0; 
    SET @var_len = LENGTH(arg_word); 

    WHILE(@var_counter < @var_len) 
    DO 
     INSERT INTO temp VALUES (SUBSTRING(arg_word, @var_counter, 1)); 
     SET @var_counter = @var_counter + 1; 
    END WHILE; 

    SELECT GROUP_CONCAT(DISTINCT letter ORDER BY letter SEPARATOR '') 
    INTO @var_sort_word 
    FROM temp; 

    DROP TEMPORARY TABLE IF EXISTS temp; 

    RETURN IFNULL(@var_sort_word, ""); 
END; 

下面的查詢會發現,在分類字典中的單詞排序輸入字:

SELECT * 
FROM dictionary 
WHERE fn_sort_string(input_word) LIKE CONCAT('%',fn_sort_string(word),'%'); 
+0

是的,這將導致包含所有可能的單詞的數組包含所需的子字符串,因此您不需要對數據庫的500000個請求。 – Peon 2012-07-24 06:21:38