Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算和连接mySQL上来自不同数据库的两个表?_Mysql_Sql_Database - Fatal编程技术网

如何计算和连接mySQL上来自不同数据库的两个表?

如何计算和连接mySQL上来自不同数据库的两个表?,mysql,sql,database,Mysql,Sql,Database,我有两个数据库。它们是core和push 这是core数据库中的subs表: +----+---------+----+----+-----+ | id | service | ad | op | act | +----+---------+----+----+-----+ | 1 | CHO | 96 | x | 1 | | 2 | CHO | 98 | x | 1 | | 3 | DANG | 96 | x | 1 | | 4 | HOORAY

我有两个数据库。它们是
core
push

这是
core
数据库中的
subs
表:

+----+---------+----+----+-----+
| id | service | ad | op | act |
+----+---------+----+----+-----+
| 1  | CHO     | 96 | x  |  1  |
| 2  | CHO     | 98 | x  |  1  |
| 3  | DANG    | 96 | x  |  1  |
| 4  | HOORAY  | 96 | x  |  1  |
| 5  | CHO     | 98 | x  |  1  |
| 6  | DANG    | 96 | x  |  1  |
+----+---------+----+----+-----+
+----+---------+-------+
| id | service |  sub  |
+----+---------+-------+
| 1  | DANG    | daily |
| 2  | HOORAY  | daily |
| 3  | DANG    | daily |
+----+---------+-------+
这是
push
数据库中的
buff
表:

+----+---------+----+----+-----+
| id | service | ad | op | act |
+----+---------+----+----+-----+
| 1  | CHO     | 96 | x  |  1  |
| 2  | CHO     | 98 | x  |  1  |
| 3  | DANG    | 96 | x  |  1  |
| 4  | HOORAY  | 96 | x  |  1  |
| 5  | CHO     | 98 | x  |  1  |
| 6  | DANG    | 96 | x  |  1  |
+----+---------+----+----+-----+
+----+---------+-------+
| id | service |  sub  |
+----+---------+-------+
| 1  | DANG    | daily |
| 2  | HOORAY  | daily |
| 3  | DANG    | daily |
+----+---------+-------+
我想数一数
subs
buff
。我对SUB进行了以下查询:

select service, ad, op, count(1) as sub where act=1 group by service,ad,op;

RESULT:
+---------+----+----+-----+
| service | ad | op | sub |
+---------+----+----+-----+
|  CHOO   | 96 | x  |  1  |
|  CHOO   | 98 | x  |  2  |
|  HOORAY | 96 | x  |  1  |
|  DANG   | 96 | x  |  2  |
+---------+----+----+-----+
这是对buff的查询:

select service, count(1) as pushed
from buff a where sub = 'daily'
group by service;

RESULT:
+---------+---------+
| service |  pushed |
+---------+---------+
|  HOORAY |    1    |
|  DANG   |    2    |
+---------+---------+
所以,我的问题是如何连接来自两个不同数据库的表? 以下是我预期的结果:

 +---------+----+----+-----+--------+
 | service | ad | op | sub | pushed |
 +---------+----+----+-----+--------+
 |  CHOO   | 96 | x  |  1  |    0   |
 |  CHOO   | 98 | x  |  2  |    0   |
 |  HOORAY | 96 | x  |  1  |    1   |
 |  DANG   | 96 | x  |  2  |    2   |
 +---------+----+----+-----+--------+

一种选择是将当前的两个子查询连接在一起。我在下面使用了一个完整的外部联接,因为我们希望处理一个服务可能只出现在
subs
buff
表中,而不是同时出现在这两个表中

SELECT t1.service,
       t1.ad,
       t1.op,
       t1.sub,
       COALESCE(t2.pushed, 0) AS pushed
FROM
(
    SELECT service, ad, op, COUNT(*) AS sub
    FROM subs
    WHERE act = 1
    GROUP BY service,ad,op
) t1
LEFT JOIN
(
    SELECT service, COUNT(1) AS pushed
    FROM buff a
    WHERE sub = 'daily'
    GROUP BY service
) t2
    ON t1.service = t2.service
UNION
SELECT t2.service,
       COALESCE(t1.ad, -1),
       COALESCE(t1.op, -1),
       COALESCE(t1.sub, -1),
       t2.pushed
FROM
(
    SELECT service, ad, op, COUNT(*) AS sub
    FROM subs
    WHERE act = 1
    GROUP BY service,ad,op
) t1
RIGHT JOIN
(
    SELECT service, COUNT(1) AS pushed
    FROM buff a
    WHERE sub = 'daily'
    GROUP BY service
) t2
    ON t1.service = t2.service

一种选择是将当前的两个子查询连接在一起。我在下面使用了一个完整的外部联接,因为我们希望处理一个服务可能只出现在
subs
buff
表中,而不是同时出现在这两个表中

SELECT t1.service,
       t1.ad,
       t1.op,
       t1.sub,
       COALESCE(t2.pushed, 0) AS pushed
FROM
(
    SELECT service, ad, op, COUNT(*) AS sub
    FROM subs
    WHERE act = 1
    GROUP BY service,ad,op
) t1
LEFT JOIN
(
    SELECT service, COUNT(1) AS pushed
    FROM buff a
    WHERE sub = 'daily'
    GROUP BY service
) t2
    ON t1.service = t2.service
UNION
SELECT t2.service,
       COALESCE(t1.ad, -1),
       COALESCE(t1.op, -1),
       COALESCE(t1.sub, -1),
       t2.pushed
FROM
(
    SELECT service, ad, op, COUNT(*) AS sub
    FROM subs
    WHERE act = 1
    GROUP BY service,ad,op
) t1
RIGHT JOIN
(
    SELECT service, COUNT(1) AS pushed
    FROM buff a
    WHERE sub = 'daily'
    GROUP BY service
) t2
    ON t1.service = t2.service

使用数据库名作为带点的表名前缀,我不检查下面的句子,它只显示了想法:

 SELECT service, ad, op, count(1) AS sub FROM core.subs AS t1
 LEFT JOIN push.buff AS t2 ON t1.service=t2.service WHERE t1.act=1
 AND sub = 'daily' GROUP BY t1.service,t1.ad,t1.op

使用数据库名作为带点的表名前缀,我不检查下面的句子,它只显示了想法:

 SELECT service, ad, op, count(1) AS sub FROM core.subs AS t1
 LEFT JOIN push.buff AS t2 ON t1.service=t2.service WHERE t1.act=1
 AND sub = 'daily' GROUP BY t1.service,t1.ad,t1.op

它起作用了。非常感谢你的帮助。上帝保佑你:)@arifinistighfarizahro为真正丑陋的外部连接而作的演讲。如果您确信这两个表中的一个表保证所有服务都存在于另一个表中,那么您只需使用
联合的一半就可以了。非常感谢你的帮助。上帝保佑你:)@arifinistighfarizahro为真正丑陋的外部连接而作的演讲。如果您确信两个表中的一个表保证所有服务都存在于另一个表中,那么您只需使用
联合的一半即可。