2011-03-14 24 views
1

這是我當前的查詢MySQL,最快捷的方式選擇一個短語作爲單獨的單詞?

WHERE Keywords.Word = '$search' 

但如果$search這隻能是一個字,如果兩個或三個詞,那麼它不會發現任何東西作爲我的關鍵字表字場只有每記錄一個字。

最快的方法是什麼?

+0

的'$'表示你直接在你的SQL語句中插入值。您的代碼可能容易受到[SQL注入](http://unixwiz.net/techtips/sql-injection.html)的影響,這是一個非常嚴重的[安全風險](http://bobby-tables.com/)。防止注入的最好方法是使用準備好的語句(儘管它們僅通過簡單的值來幫助注入;其他部分的語句,如表和列名稱,以及複合值通常仍需要插值),您的數據庫訪問提供者應該支持。如果沒有,則使用過時的DA提供程序。 – outis 2011-03-14 08:17:36

+0

謝謝你,我使用'$ search = mysql_real_escape_string($ search);'我希望是足夠好的 – Jules 2011-03-14 09:12:38

+0

轉義工作,但很容易忘記,這不是準備好的語句的問題。另外,如果您多次執行相同的查詢,則預處理語句更具性能。 – outis 2011-03-14 20:35:23

回答

1

取決於你的編程語言,拆分搜索項到一個數組中,並使用IN條款:

WHERE Keywords.Word IN ('$search[0]','$search[1]',...) 
+0

嗯,我很困惑,我會認爲它會匹配其他人的第一件作品。我使用的第一個單詞在數據庫中是獨一無二的,第二個單詞是一個非常流行的單詞。它沒有顯示出第一份工作的結果。有什麼我可以做的改進呢? – Jules 2011-03-14 09:06:59

0

我會根據搜索條件創建虛擬表,並根據表列添加聯接。

喜歡的東西

SELECT * 
FROM table t 
     LEFT JOIN (SELECT 'term1' AS name 
      UNION 
      SELECT 'term2' AS name 
      UNION 
      SELECT 'term3' AS name) f 
     ON f.name = w.Word 
WHERE (f.name IS NOT NULL) 
GROUP by t.id 

在這種情況下,你會動態地構建虛擬表中的值靜態硬編碼值(term1,2,3),你需要在以下幾列添加索引

  1. (字)
  2. 假設你有主鍵id
+0

w是什麼?什麼是'f'? – 2011-03-14 08:25:56

+0

好問題Andriy – Jules 2011-03-14 09:11:55

+0

我已經更新了答案。 – Pentium10 2011-03-14 10:57:52

相關問題