mysql - 表 A 与 LEFT JOIN 表 B 的总和也计算所有表 B
问题描述
我有一张桌子A
和相关表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
非常感谢任何帮助。
解决方案
我将从按 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 分组
推荐阅读
- java - Flink 滚动文件异常
- amazon-kinesis - AWS Kinesis-每台设备的第一个事件时间
- maven - 如何在 maven-dependency-plugin 中排除一种依赖的传递依赖
- sharepoint - SharePoint Online 文档集限制
- swift - TableView单元内的快速CollectionView
- zoho - Zoho Deluge:如何发送电子邮件
- amp-html - 构建仅 AMP 网站的实际限制是什么?
- dictionary - Xamarin.forms 和 UrhoSharp 中使用 Texture2D 视图加载室内地图图像
- python - 使用 cx_Oracle 和 Python 3.6 在 Oracle 中插入以毫秒为单位的 TIMESTAMP
- ruby-on-rails-5 - RoR 角色管理 - rolify gem - 与 UUID 和整数 ID 的资源一起使用