【问题标题】:OUTER JOIN equivalent in MySQLMySQL 中的 OUTER JOIN 等价物
【发布时间】:2014-10-29 10:23:56
【问题描述】:

我在 MySQL 数据库中有两个表,代表一群人。 c_origc_now 表将 person_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 JOINs 似乎太麻烦了。我想我忽略了一个简单的方法来实现这一点。谁能帮我吗?期望的输出:

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

【问题讨论】:

    标签: mysql outer-join


    【解决方案1】:

    您可以使用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

    【讨论】:

    • 我必须将第一个 LEFT JOIN 更改为 RIGHT JOIN 才能在输出中获得 NULL 值,但它可以工作。谢谢! :-)
    • 再想一想:我想它只在我的真实示例中有效,因为我没有行只有流出而不流入,但是对于当前查询,这样的行是否也会出现在输出中?
    • @physicalattraction 。 . .是的。两个表中的所有集群都将在输出中,因为它们在 c 子查询中。
    猜你喜欢
    • 1970-01-01
    • 2011-10-15
    • 2023-03-05
    • 1970-01-01
    • 2011-02-13
    • 2010-09-20
    • 2012-06-22
    • 2021-03-06
    • 2012-05-04
    相关资源
    最近更新 更多