(我的)SQL查询在多个表(某些行,某些列)上搜索多个值

时间:2011-10-19 15:23:00

标签: php mysql sql

我正在使用MySQL&创建搜索PHP在现有的表结构上。

可以输入多个搜索关键字,用户可以选择匹配ALL或ANY。任何形式都不是太难,但我在为AND形式编写有效的解决方案时我的头脑。

以下是关于AND表单的信息,因此必须找到所有搜索关键字。

我必须使用的2个表(搜索)具有如下结构:

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

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

(真正的解决方案也将有第3个表,但结构与Table1相同。表2将有大约20个可搜索的列)

对于每个具有不同文本的item_id,Table1可以有多行。

考虑只有2个搜索关键字(实际上可以更多),然后两者必须存在于: - 都在一行/列中 要么: - 在2个不同的列中,可能是不同的表。 要么: - 在具有相同item_id的2个不同行中(如果在Table1的不同行中找到两个关键字)

所有我能提出的都是非常密集的子查询,但这会导致服务器关闭或响应时间会很长。

当我使用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个表,如Table2。这不应该对解决方案产生影响,尽管从性能角度考虑这一点。

搜索示例:
关键词:aaa bbb
应该返回:
- item_id = 1。这两个关键字都在列t1_text_a中找到。

关键词:ccc ddd
应该返回:
- item_id = 1。 “ccc”位于t1_text_c中,“ddd”位于t1_text_d。
- item_id = 2。 “ccc”在t1_text_a中找到,“ddd”在t1_text_b中找到。

关键词:kkk lll
应该返回:
- item_id = 1。在t2_text列中的Table2的单行中找到两个关键字 - item_id = 2。这两个关键字都在Table2中找到,但是在具有相同item_id的单独行中。

关键词:bbb mmm
应该返回:
- item_id = 3。在表1.t1_text_a中可以找到“bbb”,在table2.t2_text中可以找到“mmm”。

到目前为止我的进展

实际上,我现在放弃了尝试在大多数SQL中捕获它。

我所做的是为每个表创建一个查询,检索与至少一个搜索关键字匹配的任何行。如果只有一个搜索关键字,则查询使用LIKE,否则使用REGEXP'keyword1 | keyword2'。

将这些行放在PHP数组中,其中item_id作为索引,并将所有字符串(可搜索列)的串联作为值。完成检索所有可能的行后,我会在数组中搜索与连接字段中所有关键字匹配的行。

很可能不是最佳解决方案,如果搜索将返回至少有1个匹配的许多候选行,它将无法很好地扩展。

1 个答案:

答案 0 :(得分: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声明有关,以获取更多细节。

但正如Tom H.所说,如果你能发布一个更精确的表格结构和搜索术语的真实例子,那就更好了......