我有两个具有相同架构的数据库。我需要在两个表上执行连接才能获得页面结果。 我对加入数据库毫无头绪。因此,我的现有查询已在第一个数据库中加入。
这是我的疑问:
$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是这里的两个数据库
我使用了相同的连接链接,因为我在某处读到它与服务器的连接,可用于访问同一服务器上的任何数据库。
感谢您的帮助和时间,非常感谢。
答案 0 :(得分:2)
听起来您想要UNION
或UNION 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”,或者可以从任何数据库中的任何表中进行选择的全局权限。)