我正在使用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个匹配的许多候选行,它将无法很好地扩展。
答案 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.所说,如果你能发布一个更精确的表格结构和搜索术语的真实例子,那就更好了......