這是我當前的查詢MySQL,最快捷的方式選擇一個短語作爲單獨的單詞?
WHERE Keywords.Word = '$search'
但如果$search
這隻能是一個字,如果兩個或三個詞,那麼它不會發現任何東西作爲我的關鍵字表字場只有每記錄一個字。
最快的方法是什麼?
這是我當前的查詢MySQL,最快捷的方式選擇一個短語作爲單獨的單詞?
WHERE Keywords.Word = '$search'
但如果$search
這隻能是一個字,如果兩個或三個詞,那麼它不會發現任何東西作爲我的關鍵字表字場只有每記錄一個字。
最快的方法是什麼?
取決於你的編程語言,拆分搜索項到一個數組中,並使用IN
條款:
WHERE Keywords.Word IN ('$search[0]','$search[1]',...)
嗯,我很困惑,我會認爲它會匹配其他人的第一件作品。我使用的第一個單詞在數據庫中是獨一無二的,第二個單詞是一個非常流行的單詞。它沒有顯示出第一份工作的結果。有什麼我可以做的改進呢? – Jules 2011-03-14 09:06:59
IN
條款不會給你最好的性能。你可以看看my answer on this other question。
我會根據搜索條件創建虛擬表,並根據表列添加聯接。
喜歡的東西
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),你需要在以下幾列添加索引
id
的'$'表示你直接在你的SQL語句中插入值。您的代碼可能容易受到[SQL注入](http://unixwiz.net/techtips/sql-injection.html)的影響,這是一個非常嚴重的[安全風險](http://bobby-tables.com/)。防止注入的最好方法是使用準備好的語句(儘管它們僅通過簡單的值來幫助注入;其他部分的語句,如表和列名稱,以及複合值通常仍需要插值),您的數據庫訪問提供者應該支持。如果沒有,則使用過時的DA提供程序。 – outis 2011-03-14 08:17:36
謝謝你,我使用'$ search = mysql_real_escape_string($ search);'我希望是足夠好的 – Jules 2011-03-14 09:12:38
轉義工作,但很容易忘記,這不是準備好的語句的問題。另外,如果您多次執行相同的查詢,則預處理語句更具性能。 – outis 2011-03-14 20:35:23