如何计算和连接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为真正丑陋的外部连接而作的演讲。如果您确信两个表中的一个表保证所有服务都存在于另一个表中,那么您只需使用联合的一半即可。