2011-08-24 68 views
1

我在mySQL中有一個查詢,意思是返回在我們網站上使用的搜索詞。是的,這是一個標籤雲,是的,我知道這是一個m魚:)在子查詢中轉義%符號

我們有一個管理員頁面,管理員可以查看搜索條件,並選擇將它們排除在雲中顯示。這些詞進入「badWords」表。我們已經得到了一些條款,如「foo%2525252525252520bar」,並且我們很難排除這些條款。

僞代碼,查詢到獲得雲搜索詞是:

SELECT * FROM `searchTerms` WHERE `word` NOT IN (SELECT `word` FROM `badWords`) 

這工作得很好,除非從子查詢返回的條件之一,它有一個%。有沒有辦法逃避整個子查詢?我試過做

replace(SELECT `word` FROM `badWords`, '%', '\%') 

......但這顯然不是語法正確。

我可以做兩個查詢,如果需要的話,但想知道是否有辦法讓它按原樣完成。

謝謝!

==============================

UPDATE:關閉此就目前而言,我認爲錯誤在別處。一旦我知道肯定會回來報告,但不希望人們浪費時間在這裏回答這個問題,如果它不是正確的問題...

Upvoted迄今收到的兩個回覆。多謝你們。

==============================

更新2:嘆息沒關係......可以」牛逼關閉它:\

==============================

最後更新:嗯,看起來像轉義價值不是問題。在添加到badWords表之前,管理頁面會傳遞URL中的值。在通過URL傳遞值時,它會更改。因此,添加到badWords的內容實際上是「foo%25252525252520bar」(有一個更少的「25」序列)。如果我手動更新badWords中的值,並添加缺少的「25」,則按預期工作。所以沒有必要替換或逃脫任何東西。我只需要適當修復這些URL值。

==============================

+0

你不能立即修改搜索條件嗎?爲什麼那些關於'壞字'的大驚小怪? – glglgl

+0

@glglgl - 立即修改搜索條件是我計劃研究的下一件事。目前,我想用現有數據修復現有的功能。 – charliegriefer

回答

2

我不是很好的與MySQL的語法,但SQL服務器讓我們這樣做這樣說:

SELECT * FROM `searchTerms` WHERE `word` NOT IN (SELECT REPLACE(`word`, '%', '\%') FROM `badWords`) 

注:基本上我所做的就是將你的REPLACE在一些=)希望這有助於。

3

我不認爲%是你的問題在這裏。我認爲你試圖在子查詢本身(SELECT ...)上使用REPLACE(),而不是在列值(word)上使用。試試這個:

SELECT * FROM `searchTerms` 
WHERE `word` NOT IN (
    SELECT REPLACE(`word`, '%', '\%') AS word FROM `badWords` 
); 

祝你好運!