【问题标题】:Joining two similar datatabases on same server在同一台服务器上连接两个相似的数据库
【发布时间】:2014-03-21 17:30:22
【问题描述】:

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

这是我的查询:

$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 ");  

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

更新:这里有两个连接,具有相同的主机和不同的用户名和密码。虽然我没有收到任何连接错误,但脚本没有返回任何内容。这里一定有错误吗:

    $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是这里的两个数据库

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

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

【问题讨论】:

  • 我很好奇您所说的 “合并” 表是什么意思?
  • 我的错,我的意思是加入数据库。
  • 您是否尝试过对两个数据库使用相同的查询,并使用UNION“加入”结果?
  • 我没有,我会尽力回复你。谢谢你的想法。
  • JOIN 跨多个数据库(在同一服务器上)的表的唯一技巧是,您必须在每个表名前显式地添加数据库名称,例如SELECT ... FROM database_A.table_A AS A JOIN database_B.table_B AS B;而不是USE database_A; SELECT ... FROM table_A AS A JOIN table_B AS B;

标签: php mysql database


【解决方案1】:

听起来你想要一个 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,在db1数据库中标识为mytable的表,(显然假设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 权限(它可以通过对 otherdatabase 中的每个表的“授予选择”,或者它可以是从任何数据库中的任何表中选择的全局权限。)

【讨论】:

  • 这不起作用,如果您发现任何错误,请查看我的更新。非常感谢。
  • 完全明白。我很感激你花时间以如此好的方式解释。看着这个,我认为我更新的查询应该可以工作(想法?)我仍在等待我们的数据库团队获得第二个数据库的选择权限,并将尽快更新您。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多