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