Mysql 在三表联接中计算两个独立的group by子句
跨三个表联接独立计算关系 当连接两个表时,我知道如何使用count和groupby子句来计算一个表的id在另一个表中作为关系出现的次数,但我不知道如何独立地计算两个表中的数字二这样的关系 考虑三个表A、B和C以及以下示例数据Mysql 在三表联接中计算两个独立的group by子句,mysql,sql,Mysql,Sql,跨三个表联接独立计算关系 当连接两个表时,我知道如何使用count和groupby子句来计算一个表的id在另一个表中作为关系出现的次数,但我不知道如何独立地计算两个表中的数字二这样的关系 考虑三个表A、B和C以及以下示例数据 Table A Table B Table C |id| |id|A_id| |id|A_id| -- -- ---- -- ---- |1 |
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
我希望查询表a中的每个条目,我将获得表B中的相关条目数以及表C中的相关条目数。对于上述数据,我希望查询返回以下内容:
A_id|Count(B)|Count(C)
---- -------- --------
|1 |2 |1
|2 |0 |1
|3 |1 |2
|4 |1 |0
您需要在子查询中对它们进行计数
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
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
之前需要执行分组,因为您的某些子表中最终会出现重复项,这可能会影响您的结果。如果(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
但是如果不是,你必须使用子查询进行计数。昨晚我在床上的时候想到了使用子查询的想法,所以我很高兴其他人也这么建议。我认为我的查询比上面建议的其他查询更简单,而且似乎运行得非常快,但我希望您能提供一些信息,说明我的查询是否比已经给出的查询更好/更差
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;
@jw。我正在计算
distinct B.id
和distinct C.id
,因此这将给出正确的结果,除非表B或表C中存在重复的(id,A_id)组合谢谢您的建议。我已经试过了,虽然它对我的数据有效,但它的查询速度非常慢。我所有的id列都是主键,我在表B和C中的A_id列上都有索引。我不知道这是查询还是我的索引不好?我在计算distinct,distinct有时可能会很慢。我不知道为什么你的查询速度比其他人快,但我觉得很好!对不起,我不是说我的查询比其他的快,它的速度和其他的一样,但是我认为它更简单,更可读。我不擅长编写SQL,我希望有人能给出合理的理由,说明哪些建议的查询是最好的,这样我就可以自己学习如何编写更好的查询。我同意您的解决方案,它是最简单、最容易阅读的,而且是正确的。我怀疑它可能会很慢,但我的查询也可能会很慢,因为它使用了distinct,而您的查询不使用。即使使用group by的查询也是不错的解决方案,很难判断哪一个是最好的。。。它们都能工作,而且都使用不同的技术。。。有时你可以选择你想要的技术,有时你只能使用一种,但我认为了解它们是如何工作的很重要!