2014-05-18 91 views
0

我正在製作一個成員搜索引擎,其中有一個文本字段和三個名爲interest_1,interest_2和interest_3的sql列。假設其中一位成員的專欄中有不同詞語,其中interest_1 = cat,interest_2 = dog,interest_3 = fish。我希望搜索引擎允許用戶在文本字段中輸入(例如)貓,點擊搜索按鈕,並且它將檢查並顯示那些在interest_1,interest_2或interest_3中擁有單詞cat的人的結果(這意味着一個人可以擁有interest_1 = cat,另一個擁有interest_3 = cat並且他們都出現在搜索結果中)。LIKE/OR SQL查詢,語法錯誤或錯誤的邏輯?

因此,我試圖讓這個查詢:

mysql_query("SELECT * FROM search_table WHERE 
something LIKE '{$something}%' 
&& (interest LIKE '{$interest_1}%' OR interest LIKE '{$interest_2}%' OR interest LIKE     '{$interest_3}%') 
&& (interest_2 LIKE '{$interest_1}%' OR interest_2 LIKE '{$interest_2}%' OR interest_2 LIKE '{$interest_3}%') 
&& (interest_3 LIKE '{$interest_1}%' OR interest_3 LIKE '{$interest_2}%' OR interest_3 LIKE '{$interest_3}%') 
&& something LIKE '{$something}%' 
;"); 

會發生什麼事是,當人們搜索與其他文本框別的東西,離開利益領域的空白,搜索引擎成功地對結果進行過濾。但是,如果有人試圖輸入並搜索興趣文本框,數據庫中的每個成員都會出現(沒有任何內容會被過濾)。

我檢查過它,查詢似乎符合邏輯,所以我懷疑這是一個語法錯誤。然而,我可能是錯的,語法是正確的,但我的邏輯是錯誤的。任何人都可以告訴我問題是什麼,如何修復此查詢?

+0

超過90%的查詢字符串正在形成並且出現錯誤的情況下,通過查看生成的查詢,您可以非常輕鬆地發現錯誤。將該字符串分配給一個變量並將其打印出來以查看實際正在運行的內容。如果結果不明顯,請用結果編輯您的問題。 –

+0

imho問題不在於您的查詢,而在於您的表格設計;你不應該有興趣作爲一個重複組,而是有一個單獨的關聯表與一個外鍵到主表和一個興趣列 - 那麼你的查詢會更簡單(我懷疑速度更慢,如果不是更快) – Bohemian

回答

0

{$something}爲空時,查詢將返回所有記錄。所以先檢查它是否爲空。如果不是,則使用LIKE進行過濾。

使用此邏輯對每個條件WHERE條款:

({$something}='' OR something LIKE '{$something}%') 

OR

({$something} IS NULL OR something LIKE '{$something}%') 

說明:

如果這個條件在WHERE條款補充說,這將使用篩選記錄僅當{$something}而不是空或空。

0

我敢肯定,你想要的是or三個利益不and邏輯:

where something LIKE '{$something}%' and 
     (interest LIKE '{$interest_1}%' OR interest LIKE '{$interest_2}%' OR interest LIKE     '{$interest_3}%') or 
     interest_2 LIKE '{$interest_1}%' OR interest_2 LIKE '{$interest_2}%' OR interest_2 LIKE '{$interest_3}%' or 
     interest_3 LIKE '{$interest_1}%' OR interest_3 LIKE '{$interest_2}%' OR interest_3 LIKE '{$interest_3}%' 
    ) and 
     something LIKE '{$something}%'; 

這是不可能的三列稱爲interestinterest_2interest_3所有開始與相同的利息價值。而且,對於閱讀SQL的人,AND&&更受歡迎。 (儘管MySQL確實同時支持,AND是ANSI標準,並被所有數據庫使用。)

而且,雖然提到列,但在多列中重複使用相同的實體(「興趣」)通常是數據庫設計不佳的標誌。你可能應該有一個聯合/關聯表,每一行和每一行都有一行。