簡體   English   中英

(My)SQL查詢可在多個表(某些行,某些列)上搜索多個值

[英](My)SQL Query to search for multiple values on multiple tables (some rows, some columns)

我在現有表結構上使用MySQL和PHP創建搜索。

可以輸入多個搜索關鍵字,並且用戶可以選擇匹配ALL或ANY。 任何形式都不太困難,但是我在為AND形式寫一個有效的解決方案時不知所措。

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

我必須使用(搜索)的2個表的結構如下:

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

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

(真正的解決方案也將有一個第三張表,但是結構與表1相同。表2將具有約20個可搜索列)

對於每個item_id,Table1可以有多行,並帶有不同的文本。

考慮僅具有2個搜索關鍵字(實際可以更多),則兩個關鍵字都必須存在於:-單個行/列中;或-存在於不同表的2個不同列中。 或:-在2個不同的行中具有相同的item_id(如果在表1的不同行中找到兩個關鍵字)

我所能想到的只是非常密集的子查詢,但這會使服務器宕機或響應時間非常長。

當我使用PHP時,我可以使用中間查詢並存儲結果以供以后的最終查詢使用。

有人建議嗎?

編輯:那里有實際示例的要求,所以就在這里。

考慮以下兩個帶有數據的表:
表格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個表(如Table2)。 盡管應該從性能角度考慮,但這不應對解決方案有所影響。

搜索示例:
關鍵字: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。 這兩個關鍵字都在表2中找到,但是在單獨的行中具有相同的item_id。

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

到目前為止我的進度

實際上,到目前為止,我實際上放棄了嘗試在大多數SQL中抓住這一點。

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

這些行被放置在一個PHP數組中,其中item_id為索引,所有字符串(可搜索列)的串聯為值。 完成檢索所有可能的行后,我在數組中搜索與串聯字段中的所有關鍵字匹配的行。

最有可能不是最佳解決方案,並且如果搜索將返回許多具有至少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語句進行調整,以獲得所需的結果。 Google提供了一些帶有LIKE語句的連接示例,以獲取更多詳細信息。

但是正如湯姆·H(Tom H.)所說,最好是發布一個更精確的表結構和一個實際的搜索詞示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM