首页 > 解决方案 > 表 A 与 LEFT JOIN 表 B 的总和也计算所有表 B

问题描述

我有一张桌子A

表A数据

和相关表B

表B数据

由表中的唯一 ID 加入A 我想计算表中的行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 和 Visited 中只有 1。

第一个结果

一旦我在 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”的数量。 第二个sql

非常感谢任何帮助。

标签: mysqlgroup-bycountgrouping

解决方案


我将从按 tableA ID 列分组的 tableB 的预查询开始。现在回到原来的 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 对内部“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、A.Area 分组


推荐阅读