tableA与LEFT JOIN tableB的总和也计入所有tableB

时间:2020-02-07 11:02:56

标签: mysql group-by count grouping

我有一张桌子A

Table A data

和相关表B

Table B data

在表A中加入唯一ID 我要计算表A中的行,还要计算表A中存在相关表B

的行

我有查询

SELECT NameID,Area,Area !="" AS Kount, 
b.tableaID > 0 AS `Visted`
FROM `tablea` a 
LEFT OUTER JOIN tableb b ON a.ID=b.tableaID 
GROUP BY a.ID,b.tableaID,Area

这给了我一个NameID和区域列表,每个区域仅显示一次,但显然在Kount and Visited中仅显示1。

First Result

例如,我在Kount上加了一笔金额。

SELECT NameID,Area,SUM(Area !="") AS Kount, 
SUM(b.tableaID > 0) AS `Visted`
FROM `tablea` a 
LEFT OUTER JOIN tableb b ON a.ID=b.tableaID 
GROUP BY a.ID,b.tableaID,Area

我还算出所有表'B'的数量,甚至以为我有适当的组。 Second sql

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我将从对tableB的预查询开始,该查询由tableA ID列分组。现在回到原始的tableA,然后向LEFT-JOIN返回tableB的预查询结果。

select
      A.*,
      coalesce( BQry.bRecs, 0 ) as NumBRecords
   from
      tableA A
         LEFT JOIN
         ( select
                    tableaID,
                    count(*) bRecs
                from
                    tableB
                group by
                    tableaID ) BQry
        on A.id = BQry.tableaID

现在,表“ A”侧具有一个ID,我怀疑该ID是主键,并且在此表中再也没有“ ID”的任何重复项。因此,按照该ID对内部“ BQry”表进行分组是您左联接所具有的联接的基础。 “ A”侧将始终为1,因为它是查询的记录基础。

如果tableAID上没有这样的匹配项,则BQry记录的Coalesce()将为0,如果找到则为实际计数。

为了将来,请勿尝试扩大评论的答案...只需编辑您现有的帖子并为其添加其他详细信息即可。

版本

重新查看后,我看到您不是基于tableA ID进行外部求和,而是基于TableID进行名称计算。多个tableAID可以具有相同的名称引用。

select
      A.NameID,
      A.Area,
      count(*) as NameCounts,
      sum( coalesce( BQry.bRecs, 0 )) as NumBRecords
   from
      tableA A
         LEFT JOIN
         ( select
                    tableaID,
                    count(*) bRecs
                from
                    tableB
                group by
                    tableaID ) BQry
        on A.id = BQry.tableaID

分组依据 A.NameID, 面积