2011-10-19 159 views
0

我正在使用MySQL &在現有表結構上創建一個搜索。(我的)SQL Query在多個表(某些行,某些列)上搜索多個值

可以輸入多個搜索關鍵字,用戶可以選擇匹配ALL或ANY。任何形式都不是太難,但是我爲寫AND形式的有效解決方案而頭痛。

以下是關於AND表單,所以必須找到所有的搜索關鍵字。

的2代表我有(搜索中)的工作具有這樣的結構,如下所示:

表1 - ITEM_ID(非唯一) - 文本

表2 - ITEM_ID(唯一) - text_a - text_b - text_c

(真正的解決方案也將有一個第三表,但是這是結構上的方式表1表2相同將有大約20 searchabl。 e列)

對於每個item_id具有不同文本的表1可以有多行。

考慮只有2搜索關鍵詞(可以更實時直播),然後都必須存在於: - 無論是在一個單一的行/列 或: - 也許在不同的表中的2個不同的列。 或: - 在同一ITEM_ID 2個不同行(在表1的不同行發現這兩個關鍵字的情況下)

所有我能想出非常密集的子查詢,但會關閉服務器或響應時間將是巨大的。

因爲我使用PHP,我可以使用中間查詢並存儲結果以供以後的最終查詢使用。

任何一些很好的建議?

編輯:有哪些地方需要真實的例子,所以在這裏。

考慮以下2個表的數據:
表1

+---------+-----------+-----------+-----------+-----------+ 
| item_id | t1_text_a | t1_text_b | t1_text_c | t1_text_d | 
+---------+-----------+-----------+-----------+-----------+ 
|  1 | aaa bbb | NULL  | ccc  | ddd  | 
|  2 | aaa ccc | ddd  | fff  | ggg  | 
|  3 | bbb  | NULL  | NULL  | NULL  | 
+---------+-----------+-----------+-----------+-----------+ 

表2

+---------+----------+---------+ 
| item_id | sequence | t2_text | 
+---------+----------+---------+ 
|  1 |  1 | kkk lll | 
|  2 |  1 | kkk  | 
|  2 |  2 | lll  | 
|  3 |  1 | mmm  | 
+---------+----------+---------+ 

PS在真正的數據庫(我不能改變,所以全文本索引或對錶定義的更改不是一個選項)Table1包含大約20個可搜索列,並且有2個表li表2。這對解決方案應該沒有什麼不同,儘管從性能的角度來看它是需要考慮的。

實施例的搜索:
關鍵詞:AAA BBB
應返回:
- ITEM_ID = 1。這兩個關鍵字都在t1_text_a列中找到。

關鍵詞:CCC DDD
應返回:
- ITEM_ID = 1。在t1_text_c中找到「ccc」,在t1_text_d中找到「ddd」。
- item_id = 2。在t1_text_a中找到「ccc」,在t1_text_b中找到「ddd」。

關鍵字:kkk lll
應該返回:
- item_id = 1。這兩個關鍵字都在t2_text列中的Table2的單行中找到。
- item_id = 2。這兩個關鍵字都在Table2中找到,但在具有相同item_id的單獨行中找到。

關鍵字:bbb mmm
應該返回:
- item_id = 3。在table1.t1_text_a中找到「bbb」,在table2.t2_text中找到「mmm」。

我迄今取得的進展

我其實,就目前而言,放棄了試圖趕上這主要是SQL。

我所做的是爲每個表創建一個查詢,檢索任何與至少1個搜索關鍵字匹配的行。如果只有1個搜索關鍵字,則查詢使用LIKE,否則使用REGEXP'keyword1 | keyword2'。

這些行放在一個PHP數組中,item_id作爲索引,並將所有字符串(可搜索的列)連接爲值。當完成檢索所有可能的行時,我在數組中搜索與連接字段中的所有關鍵字匹配的行。

最有可能不是最好的解決方案,如果搜索將返回具有至少1個匹配項的許多候選行,它將不會很好地擴展。

+0

http://lucene.apache.org/java/ docs/index.html – NullUserException

+0

不要害羞...顯示你試過的東西 –

+0

沒有人有想法嗎? – Marco

回答

1

由於您沒有提供有關您的案例的大量細節,因此很難爲您提供有限的答案。 但也許這可以給你一個起點:

SELECT * FROM table1 AS tbl1 
INNER JOIN table2 AS tbl2 
WHERE 
tbl1.text LIKE %search_word1% 
AND tbl1.text LIKE %search_word2% 
AND tbl2.text_a LIKE %search_word1% 
AND tbl2.text_a LIKE %search_word2% 
AND tbl2.text_b LIKE %search_word1% 
AND tbl2.text_b LIKE %search_word2% 
AND tbl2.text_c LIKE %search_word1% 
AND tbl2.text_c LIKE %search_word2% 

您可以適應JOIN,INNER JOIN,LEFT JOIN,RIGHT JOIN和不同LIKE和AND/OR語句來獲得你正在尋找的結果。 谷歌有些人加入了LIKE語句的例子以獲取更多細節。

但湯姆H.說,這將會是更好,如果你可以發佈一個更精確的表結構和搜索詞的真正爲例...

+0

感謝您試圖回答我的問題,但這不起作用。如果只是這麼簡單......您的查詢將只返回在所有列中都找到所有搜索關鍵字的行。搜索應該返回所有關鍵字在任何列或行中找到的值。我認爲我的原始文章包含了足夠的信息,但會嘗試創建一個真實的示例測試用例並更新問題。 – Marco

+0

第一篇文章更新了更好的例子。 – Marco