MySQL搜索多个表以获取信息

时间:2009-11-25 14:34:56

标签: php mysql

我正在构建一个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,但到目前为止没有运气。

是否有人可以帮助我进一步完成在网络应用中构建用户友好的搜索引擎的“追求”?

5 个答案:

答案 0 :(得分:1)

你应该看看一个真正的全文搜索引擎,周围有很多:

  • lucene
  • sphinx
  • Mysql:MySQL有一个全文搜索引擎,但它有点慢,所以如果你想快速解决方案,我不建议你分开使用它
  • couchDB:这不是一个真正的全文搜索引擎,但在你的情况下它可能会有所帮助,但你可以从当前的MySQL数据库创建一个数据库,并仅将其用于搜索目的。

根据表的完成方式,您可能希望创建一个包含所需信息的表。

答案 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)

一些建议:

  1. 我建议使用(INNER?)JOIN而不是SELECT FROM table1,table2。这将缩小表格的数量。这应该会大大限制输出。
  2. 查看DISTINCT关键字(或类似GROUP BY的并行),它应该进一步限制输出
  3. 不排除UNION。我不了解MySQL,但在Oracle的SQL中,它通常比使用“OR”快两到三倍。如果你有      - 不可否认,这个查询有点缺陷,但我试图证明。     选择        table1.data     从         table1,table2     哪里         table1.data = 7     联盟         选择             table1.data         从             table1,table2         哪里             table1.data = 8; 这将比使用快得多:     选择        table1.data,table2。*     从         table1,table2     哪里         table1.data = 7 OR table1.data = 8;
  4. 总的来说,我认为使用类似的东西(这是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%'))