Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在三表联接中计算两个独立的group by子句_Mysql_Sql - Fatal编程技术网

Mysql 在三表联接中计算两个独立的group by子句

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 |

跨三个表联接独立计算关系

当连接两个表时,我知道如何使用count和groupby子句来计算一个表的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

我希望查询表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的查询也是不错的解决方案,很难判断哪一个是最好的。。。它们都能工作,而且都使用不同的技术。。。有时你可以选择你想要的技术,有时你只能使用一种,但我认为了解它们是如何工作的很重要!