2015-03-19 152 views
2

我正在建立一個網站,接受用戶輸入關鍵字和輸出匹配的數據。例如,如果用戶指定關鍵字爲'Restaurant pizza',那麼我的數據庫應該輸出這樣的記錄。如何將關鍵字與SQL查詢匹配?

我現在的表有一個稱爲category列,五列從keyword1命名keyword5其中包含他們的專業領域,即「比薩」,「雞」或「燒烤」等

但我不知道怎麼樣編寫SQL查詢,因爲用戶可以按照任何順序輸入關鍵字:首先是類別,或者先是專用區域。

所以這樣的查詢一定會返回任何結果(假設用戶輸入「餐廳的比薩」查詢):

SELECT * 
    FROM message 
WHERE category LIKE 'Restaurant pizza' 
OR  keyword1 LIKE 'Restaurant pizza' 
OR  keyword2 LIKE 'Restaurant pizza' 

我想這將是一個壞主意分裂輸入關鍵字成詞,然後運行中的每一個字數據庫的WHERE子句。但我真的不知道如何實現我的目標。

另外,請你給我一些關於如何在這種情況下建立索引的建議?

+0

你好,你需要在'LIKE'語句中使用'%'例子:SELECT * FROM message WHERE category LIKE'%Restaurant pizza%'OR keyword1 LIKE'%Restaurant pizza%'OR keyword2 LIKE'%Restaurant pizza %' – PKirby 2015-03-19 06:30:50

+0

如果用戶可以按任意順序輸入。然後,您將不得不拆分並在查詢中運行輸入的每個單詞。如果你不想這樣做,你將不得不通知用戶在進入之前按特定的順序進行。它們中的任何一個。不能做他們兩個。 – 2015-03-19 06:32:44

+0

@PKirby,我想你誤解了。在OP中給出的「餐廳比薩餅」的例子中,餐廳將是類別,比薩餅將是關鍵字。 '%Restaurant pizza%'將會尋找那些在同一列中的人。此外,OP還表示可以讓用戶以任何順序輸入,例如「Pizza Restaurant」。 – 2015-03-19 06:36:46

回答

0

您應該categorykeywords列上創建FULLTEXT指數,那麼當查詢數據爆炸由定界符(空格字符)查詢字符串,然後創建查詢類似:

SELECT * FROM items 
    WHERE 
    MATCH (category,keyword1,keyword2,keyword3,keyword4,keyword5) 
    AGAINST ('pizza') 
    AND 
    MATCH (category,keyword1,keyword2,keyword3,keyword4,keyword5) 
    AGAINST ('restaurant'); 
0

你可以試試這個:

SELECT * 
FROM message 
WHERE `category` LIKE '%Restaurant%' 
AND (`keyword1` IN ('Pizza','chicken','bbq') 
OR `keyword2` IN ('Pizza','chicken','bbq'))