2010-07-12 44 views
4

我需要一些存儲過程調用,如:MySQL的存儲過程:搜索字符串的可變數目

search('foo bar') 

使得類似搜索:

SELECT FROM A, B 
WHERE A.B_ID = B.ID 
AND (A.f1 LIKE '%foo%' OR A.f2 LIKE '%foo%' OR B.f3 LIKE '%foo%') 
AND (A.f1 LIKE '%bar%' OR A.f2 LIKE '%bar%' OR B.f3 LIKE '%bar%') 

而且我有一些疑惑和問題:

  1. 我不能將數組傳遞給過程,所以我唯一的選擇是直接傳遞字符串作爲在這個例子中('foo bar')?

  2. 所以我假設我必須做SP代碼拆分。我不知道如何,所以我搜索並找到了this solution。正在使用臨時表和我認爲很多笨拙的代碼。真的很複雜嗎?表現如何?

  3. 我不知道如何創建這樣的動態查詢。我想我必須遍歷這些標記來爲每個人創建一個WHERE子句的新塊,但我不知道如何做到這一點,或者如果這是最好的解決方案。也許連接字符串,然後做一個準備好的聲明更好?

謝謝。

注意:我使用iBATIS(Java)來調用這個例程。

回答

3

你想要的是使用全文搜索(FTS) - 有MySQL的本地FTS功能,它只能在MyISAM桌面上使用,和第三方FTS如Sphinx可供選擇。這裏是an online slideshow that's a decent intro & howto

使用MySQL原生FTS,您的查詢將類似於:

SELECT * 
    FROM A AS a 
    JOIN B AS b ON b.id = a.b_id 
WHERE MATCH (a.f1, a.f2, b.f3) AGAINST ('foo bar'); 

動態SQL仍是一個選項,這取決於你想/需要使查詢有多強。我會考慮動態SQL之前的FTS產品...

+0

謝謝。我不能做這種搜索,因爲我們使用InnoDB表(幸運的是)。我會考慮獅身人面像,但我認爲安裝一個新模塊對於客戶來說不是容忍的行爲。如果不能簡單地使用存儲過程來實現,我認爲使用Java生成查詢將是更好的選擇。我錯了? – sinuhepop 2010-07-12 08:45:13

+0

@Sinuhe:這太糟糕了:(我真的試圖爲使用Sphinx做一個強有力的例子 - 顯示這兩種解決方案的速度有多快。我認爲在MySQL中使用動態SQL生成查詢會比從Java更好 - Java需要當MySQL存儲過程只需要參數時發送整個查詢 – 2010-07-12 17:10:22

+0

嗯,事實是,我最終使用iBATIS生成了查詢,我認爲安裝和維護Sphinx對於這個簡單的用例並不是強制性的。看到那裏,有帶寬? – sinuhepop 2010-07-12 17:49:57