2013-01-09 200 views
3

我需要在兩個表和我進行的查詢選擇一個單詞(關鍵字搜索)的任何事件是這樣的:MySQL查詢LIKE

SELECT t1.fname, t1.lname, t2.* FROM t1 , t2 
    WHERE t2.title LIKE "%test%" 
    OR t2.desc LIKE "%test%" 
    OR t2.inc LIKE "%test%" 
    OR t1.fname LIKE "%test%" 
    OR t1.lname LIKE "%test%" 
    AND t1.c_id = t2.c_id; 

,因爲在數據庫中的大量數據,這種特殊的搜索(與'測試'關鍵字)需要幾分鐘,我想知道如何優化這一點。 我試着用左連接,但它似乎我做錯了 - 因爲結果幾乎延期,但它查詢執行得非常快。

它是這樣的:

SELECT * FROM t2 AS a 
    LEFT JOIN t1 AS b ON a.c_id = b.c_id 
    WHERE a.desc LIKE '%test%' 
    OR a.title LIKE '%test%' 
    OR a.inc LIKE '%test%' 
    OR b.fname LIKE '%test%' 
    OR b.lname LIKE '%test%'; 

任何幫助,將不勝感激...謝謝。

+0

Whach數據庫引擎使用的是? –

+0

MyIsam ...表之前建立,我正在修復錯誤 –

+1

如果您有MyISAM表,那麼您可以使用MATCH..AGAINST關鍵字搜索多列中的字符串。檢查我的答案,它會給你如何使用MATCH..AGAINST在查詢 –

回答

2

你先聲明是不是你預期的事情:AND條款需要precedenceOR所以你實際上已經寫

t2.title LIKE "%test%" 
OR t2.desc LIKE "%test%" 
OR t2.inc LIKE "%test%" 
OR t1.fname LIKE "%test%" 
OR (t1.lname LIKE "%test%" AND t1.c_id = t2.c_id;) 

這最終導致(有點歪斜)natural join t1和t2返回不多見到很多行。

+0

是的,一定是正確的 - 結果是不好的我嘗試了你的建議,但它是一樣的,我認爲,左連接會更好嗎? –

+0

@Angel M - 我沒有提出任何建議,只是在你原來的陳述中向你顯示錯誤,我不知道你的但我認爲你應該用'FULL OUTER JOIN'替換'LEFT JOIN'來獲得t1或t2的結果。 –

+0

我的意思是 - 向我顯示錯誤 - 我找到了一種方法 - 現在我有權利結果。 –

2

嘗試MATCH..AGAINST搜索多個列的MyISAM

SELECT * 
FROM t2 AS a 
INNER JOIN t1 AS b ON a.c_id = b.c_id 
WHERE MATCH (a.desc, a.title, a.inc, b.fname, b.lname) AGAINST ('test') 

檢查此鏈接MYSQL FULL TEXT SEARCH