[英](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.