我正在构建一个searchfunctionallity,用户可以使用提供的关键字选择要搜索的不同库。还支持AND运算符。我的问题是,当我尝试搜索信息时,它会以某种方式成倍增加或者指数会增加?
我正在使用MySQL数据库和PHP来处理结果。
示例查询如下所示,为了可读性而采用的示例表名:
SELECT table1.id AS table1_id,
table2.id AS table2_id,
table1.*,
table2.*
FROM table1, table2
WHERE (table1.column1 LIKE '%key%' OR table1.column2 LIKE '%key%') OR
(table2.column1 LIKE '%key%' OR table2.column2 LIKE '%key%')
或者,当用户提供“key AND yek”等关键字时,查询将如下所示:
SELECT table1.id AS table1_id,
table2.id AS table2_id,
table1.*,
table2.*
FROM table1, table2
WHERE ( (table1.column1 LIKE '%key%' AND table1.column2 LIKE '%key%') OR
(table1.colum1 LIKE '%yek%' AND table1.colum2 LIKE '%yek%') )
OR
(( table2.column1 LIKE '%key%' AND table2.column2 LIKE '%key%') OR
(table2.colum1 LIKE '%yek%' AND table2.colum2 LIKE '%yek%') )
我已经搜索了周围并且来到了UNION,但是这不会成功。首先是因为我查询的表不相等,这是一个非常昂贵的查询。因此,因为搜索功能常常会被使用,所以它不是一种选择。
实际上我在2到4列之间查询5个表和每个表。我在其中一个表中设置了一个具有唯一值的testrow,因此我应该得到1行,但实际上我得到了更多。当我选择所有5个表时,我得到了超过10K的结果。所以我的猜测是结果会以某种方式成倍增加。我玩过运营商AND和OR,但到目前为止没有运气。
是否有人可以帮助我进一步完成在网络应用中构建用户友好的搜索引擎的“追求”?
答案 0 :(得分:1)
你应该看看一个真正的全文搜索引擎,周围有很多:
根据表的完成方式,您可能希望创建一个包含所需信息的表。
答案 1 :(得分:1)
连接将解决数据集看起来“倍增”的问题。
http://en.wikipedia.org/wiki/Join_%28SQL%29
这要求Table1中的字段也出现在Table2中并用作外键。
例如,Table1和Table2都有ProductID:
在Table1.ProductID = Table2.ProductID
上选择* From Table1 Left Outer Join Table2答案 2 :(得分:1)
一些建议:
总的来说,我认为使用类似的东西(这是Oracle语法)你会看到更好的结果:
SELECT
ti.id,
t1.data,
t2.*
FROM
table1 t1
JOIN
table2 t2
ON(
t1.id = t2.id
)
WHERE
table1.data LIKE '%foo%'
UNION
SELECT
ti.id,
t1.data,
t2.*
FROM
table1 t1
JOIN
table2 t2
ON(
t1.id = t2.id
)
WHERE
table1.data LIKE '%bar%';
-------编辑-------
有人质疑“JOIN不会起作用,因为表格完全不同”。只要存在一些可以将其中一个表与另一个表相关联的密钥,JOIN就能够(有效地)创建一个“超级表”,它可以访问两个表的所有数据。如果此索引不存在,那么您可能需要一些系统来连接SQL查询之外的信息。
答案 3 :(得分:1)
我为我的情况找到了'重'的全文解决方案。我创建了一个查询数组,其中存储了每个表的查询,之后我用它们来显示我想要的数据。大家都感谢他们的努力!
答案 4 :(得分:0)
我认为你想要的是使用UNION,它可以组合不同SELECT查询的结果。
(SELECT id FROM table1 WHERE (table1.column1 LIKE '%key%' OR table1.column2 LIKE '%key%'))
UNION
(SELECT id FROM table2 WHERE (table2.column1 LIKE '%key%' OR table2.column2 LIKE '%key%'))