【问题标题】:SUM of tableA with LEFT JOIN tableB also counts all tableB表 A 与 LEFT JOIN 表 B 的总和也计算所有表 B
【发布时间】:2020-02-07 11:02:56
【问题描述】:

我有一张桌子A

还有一张相关表B

由表 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。

只要我在 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”的数量。

非常感谢任何帮助。

【问题讨论】:

标签: mysql group-by count grouping


【解决方案1】:

我将从一个按 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,如果找到,则为实际计数。

对于未来,不要尝试在 cmets 中扩展答案...只需编辑您现有的帖子并添加其他详细信息即可。

修订版

重新看后发现你不是根据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.面积

【讨论】:

  • 非常感谢您的建议。我会试试你的建议,谢谢
  • @BinaryBridge,在重新阅读并恢复供电后,查看并修改查询以通过所有 tableA 记录中的名称/区域获得正确的总和,而不仅仅是每个 tableAID。请看一看。
猜你喜欢
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多