繁体   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