在同一服务器上连接两个相似的数据库

时间:2014-03-21 17:30:23

标签: php mysql database

我有两个具有相同架构的数据库。我需要在两个表上执行连接才能获得页面结果。 我对加入数据库毫无头绪。因此,我的现有查询已在第一个数据库中加入。

这是我的疑问:

$base = mysql_query("SELECT DISTINCT page.path, 
                page.site_id, 
                (SELECT metadata_custom.value 
                 FROM   metadata_custom 
                 WHERE  field = 'academic search title' 
                        AND page.id = metadata_custom.page_id) AS value, 
                page.id 
FROM   page 
       INNER JOIN metadata 
               ON page.metadata_id = metadata.id 
       INNER JOIN metadata_custom 
               ON page.id = metadata_custom.page_id 
WHERE  field = 'academic search keywords' 
       AND value LIKE 'undergraduate%' 
ORDER  BY value ");  

我需要相同的结果但是在第一个数据库与第二个数据库连接之后。有什么指针吗?

更新:这里有两个连接,具有相同的主机和不同的用户ID和密码。我没有得到任何连接错误,但脚本没有返回任何东西。这里一定有错误:

    $base = mysql_query("select distinct page.path,page.site_id,
 (select metadata_custom.value from db1.metadata_custom where field='academic search title' and page.id=metadata_custom.page_id) 
 AS value,
page.id from db1.page inner join db1.metadata on db1.page.metadata_id=db1.metadata.id inner join db1.metadata_custom on db1.page.id=db1.metadata_custom.page_id where field='academic search keywords' and
value like 'undergraduate%' 

UNION

select distinct page.path,site_id,(select metadata_custom.value from metadata_custom where field='academic search title' and page.id=metadata_custom.page_id) AS value,
page.id from db2.page inner join db2.metadata on db2.page.metadata_id=db2.metadata.id inner join db2.metadata_custom on db2.page.id=db2.metadata_custom.page_id where field='academic search keywords' and
value like 'undergraduate%' 

 ORDER BY value", $connection);   

db1和db2是这里的两个数据库

我使用了相同的连接链接,因为我在某处读到它与服务器的连接,可用于访问同一服务器上的任何数据库。

感谢您的帮助和时间,非常感谢。

1 个答案:

答案 0 :(得分:2)

听起来您想要UNIONUNION ALL设置运算符。该运算符组合了两个不同SELECT语句中的行。两个SELECT语句必须为每列返回相同数量的列和相同的数据类型。

例如:

SELECT 'foo' AS a, 1 AS b
 UNION ALL
SELECT 'bar', 3

要查询其他数据库,您需要使用数据库名称

限定表引用
SELECT t.mycol
  FROM mytable t
 UNION ALL
SELECT o.somecol
  FROM otherdatabase.mytable o

假设您在原始查询中使用DISTINCT关键字,则可以使用UNION运算符,从而消除重复行。 (UNION ALL运算符不执行识别和删除重复行的额外步骤。)


<强>后续

MySQL查询不能引用两个不同的连接;单个查询只能在一个连接中运行。 (显然,您可以针对两个不同的连接运行两个单独的查询。)

你说'另一个数据库',我认为它是指同一个MySQL实例上的另一个数据库。

单个连接可以访问被授予权限的任何数据库。

为了使用户(例如user1)能够从每个数据库中的表中进行选择,必须为该用户授予对表的SELECT权限。要将数据库db1和db2中的所有表的SELECT权限授予user1:

GRANT SELECT ON db1.* TO user1@'%' ;
GRANT SELECT ON db2.* TO user1@'%' ;

然后user1可以运行引用两个数据库中的表的查询:

SELECT t1.id
  FROM db1.mytable t1
 UNION ALL
SELECT t2.id
  FROM db2.mytable t2

作为一种方便的简写,我们通常不会使用数据库名称限定表引用,而是依赖于通过“USE db1;”语句或等效语句设置的当前数据库。

例如,mytable相当于对db1.mytable的引用,mytable数据库中标识为db1的表(显然假设USE语句成功。)

USE db1;
SELECT t1.id
  FROM mytable t1

这样,我们可以针对不同的数据库运行相同的语句,对语句没有任何更改,我们更改的只是当前数据库:

USE db2;
SELECT t1.id
  FROM mytable t1

在这种情况下,mytable是对db2.mytable数据库中db2表的引用。

要引用两个不同数据库中的表,我们必须至少限定对“其他”数据库中表的引用。

这就是我们必须写的原因:

SELECT t1.id
  FROM mytable t1
 UNION ALL
SELECT t2.id
  FROM otherdatabase.mytable t2

再次注意,otherdatabase这里是同一MySQL实例上另一个数据库的名称。当前连接的用户必须已被授予otherdatabase.mytable的SELECT权限(可以通过其他数据库中的每个表上的“grant select”,或者可以从任何数据库中的任何表中进行选择的全局权限。)