MySQL中的OUTER JOIN等价物

时间:2014-10-29 10:23:56

标签: mysql outer-join

我在MySQL数据库中有两个表,表示一组人。表格c_origc_nowperson_id映射到cluster个号码,如下所示:

person_id    cluster
    0           0
    1           0
    2           1
   ...         ...

我现在想知道在将c_nowc_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

1 个答案:

答案 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;

我省略了查询的详细信息,以便您可以查看查询的整体结构。只需将您的查询替换为query1query2