我在MySQL数据库中有两个表,表示一组人。表格c_orig
和c_now
将person_id
映射到cluster
个号码,如下所示:
person_id cluster
0 0
1 0
2 1
... ...
我现在想知道在将c_now
与c_orig
进行比较时,有多少人更改了群集(他们来自哪里或去哪里)。我可以通过以下两个查询来选择涌入和流出。
SET @CLUSTER = 0;
SELECT c_orig.cluster, COUNT(c_now.person_id) AS influx
FROM c_now
LEFT JOIN c_orig ON c_orig.person_id = c_now.person_id
WHERE c_now.cluster = @CLUSTER
AND (c_orig.cluster != @CLUSTER OR c_orig.cluster IS NULL)
GROUP BY c_orig.cluster;
SELECT c_now.cluster, COUNT(c_now.person_id) AS outflux
FROM c_now
LEFT JOIN c_orig ON c_orig.person_id = c_now.person_id
WHERE c_orig.cluster = @CLUSTER
AND c_now.cluster != @CLUSTER
GROUP BY c_now.cluster;
这些查询的结果:
cluster influx
NULL 39
1 8
2 5
3 2
4 16
6 9
7 2
8 1
cluster outflux
1 9
2 7
3 46
4 5
6 13
7 2
8 1
9 5
现在我想要组合这些查询,并且当查询中不存在该群集时,流量/流量为0。但是,我不能OUTER JOIN
他们,并且两个LEFT JOIN
具有不同的顺序似乎太麻烦了。我想我忽略了一个简单的方法来实现这一目标。谁能帮我吗?期望的输出:
cluster influx outflux
NULL 39 0
1 8 9
2 5 7
3 2 46
4 16 5
6 9 13
7 2 2
8 1 1
9 0 5
答案 0 :(得分:2)
您可以使用left join
执行此操作,但需要完整的群集列表。根据您的疑问,您可以将其视为:
(select cluster from c_now union
select cluster from c_orig
) c
您可以将您的查询生成为:
select c.cluster, coalesce(q1.influx, 0) as influx, coalesce(q2.outflux, 0) as outflux
from (select cluster from c_now union
select cluster from c_orig
) c left join
(query1) q1 left join
on c.cluster = q1.cluster
(query2)
on c.cluster = q2.cluster;
我省略了查询的详细信息,以便您可以查看查询的整体结构。只需将您的查询替换为query1
和query2
。