0

跨三个表连接独立计算关系。

连接两个表时,我知道如何使用 count 和 group by 子句来计算一个表的 id 作为关系出现在另一个表中的次数,但无法弄清楚如何独立计算两个表的第二个此类关系。

考虑具有以下示例数据的三个表 A、B 和 C

Table A         Table B          Table C

|id|           |id|A_id|         |id|A_id|
 --             -- ----           -- ----
|1 |           |1 |1   |         |1 |1   |
|2 |           |2 |1   |         |2 |3   |
|3 |           |3 |3   |         |3 |2   |
|4 |           |3 |4   |         |4 |3   |

在表 B 和 C 中,列 A_id 不能为 NULL,但在表 C 中,列 B_id 可以为 NULL。

我想要一个查询,这样对于表 AI 中的每个条目,将获得表 B 中相关条目的数量以及表 C 中相关条目的数量。对于上述数据,我想要一个返回以下内容的查询:

A_id|Count(B)|Count(C)
---- -------- --------
|1  |2       |1
|2  |0       |1
|3  |1       |2
|4  |1       |0
4

4 回答 4

2

您需要COUNT在子查询中使用它们。

SELECT  a.ID, 
        IFNULL(b.`COUNT(B)`, 0) `COUNT(B)`,
        IFNULL(c.`COUNT(C)`, 0) `COUNT(C)`
FROM    tableA a
        LEFT JOIN 
        (
          SELECT bb.A_ID, COUNT(*) `COUNT(B)`
          FROM   tableB bb
          GROUP BY A_ID
        ) b ON a.id = b.A_ID
        LEFT JOIN 
        (
          SELECT cc.A_ID, COUNT(*) `COUNT(C)`
          FROM   tableC cc
          GROUP BY A_ID
        )c ON a.ID = c.A_ID
于 2012-12-19T00:36:42.210 回答
0

如果 (B.id, A_id) 和 (C.id, A_id) 的组合是唯一的,则可以使用:

select
  A.ID, count(distinct B.id), count(distinct C.id)
from
  A left join B on a.ID = B.A_ID
  left join C on a.ID=C.A_ID
group by A.id

但如果不是,则必须使用子查询进行计数。

于 2012-12-19T00:52:34.740 回答
0

这比最初听起来要简单一些,尽管它需要使用子选择:

SELECT a.id, COALESCE(b.count, 0), COALESCE(c.count, 0)
FROM a
LEFT JOIN (SELECT a_id, COUNT(*) as count
           FROM b
           GROUP BY a_id) b
on b.a_id = a.id
LEFT JOIN (SELECT a_id, COUNT(*) as count
           FROM c
           GROUP BY a_id) c
on c.a_id = a.id

在加入之前需要进行分组a,因为您最终会在某些子表中出现重复项,这可能会影响您的结果。

于 2012-12-19T00:44:32.473 回答
0

昨晚我在床上时想到了使用子查询的想法,所以我很高兴这是其他人的建议。我认为我的查询比上面建议的其他查询更简单,并且似乎运行得非常快,但我希望能提供关于我的查询实际上是否比已经给出的更好/更差的输入。

SELECT 
    TableA.id, 
    (SELECT COUNT(*) FROM TableB where TableB.A_id = TableA.id) countB,
    (SELECT COUNT(*) FROM TableC where TableC.A_id = TableA.id) countC
FROM TableA;
于 2012-12-19T14:26:32.940 回答