如何使用MySQL统计三张关联表中的元素数量
嗨,我来帮你搞定这个MySQL多表统计的问题~先把你的表结构整理得更清晰些,方便我们分析关联关系:
你的三张表结构
Kardex表(客户信息表)
| KDX_Id | KDX_VIP | KDX_Regular |
|---|---|---|
| 1 | No | No |
| 2 | No | No |
BillableDatas表(计费数据表)
| BIL_Id | BIL_BookingId |
|---|---|
| 1 | 99 |
| 2 | 99 |
| 3 | 100 |
Bookings表(订单表)
| BOO_Id | BOO_ClientId |
|---|---|
| 99 | 1 |
| 100 | 2 |
从字段能看出来关联逻辑:Kardex.KDX_Id对应Bookings.BOO_ClientId(客户ID关联),Bookings.BOO_Id对应BillableDatas.BIL_BookingId(订单ID关联)。接下来分几种常见的统计需求给你写SQL:
需求1:统计每个客户的订单数和计费数据条数
这应该是最常用的场景,比如想知道每个客户有多少个订单,每个订单下有多少条计费记录:
SELECT k.KDX_Id, k.KDX_VIP, k.KDX_Regular, COUNT(DISTINCT b.BOO_Id) AS 订单数量, COUNT(bd.BIL_Id) AS 计费数据条数 FROM Kardex k LEFT JOIN Bookings b ON k.KDX_Id = b.BOO_ClientId LEFT JOIN BillableDatas bd ON b.BOO_Id = bd.BIL_BookingId GROUP BY k.KDX_Id, k.KDX_VIP, k.KDX_Regular;
小解释:
- 用
LEFT JOIN是为了保证即使某个客户没有订单或计费数据,也会出现在结果里,对应的数量会显示为0 COUNT(DISTINCT b.BOO_Id)是因为一个订单可能对应多条计费数据,直接COUNT(b.BOO_Id)会重复计数,加DISTINCT才能统计真实的订单数量COUNT(bd.BIL_Id)直接统计计费数据的总条数就行,因为每条BIL_Id都是唯一的,不用去重
需求2:快速获取三张表的总记录数
如果只是想知道每张表各自有多少条数据,用这个更简单:
SELECT (SELECT COUNT(*) FROM Kardex) AS 客户总数量, (SELECT COUNT(*) FROM Bookings) AS 订单总数量, (SELECT COUNT(*) FROM BillableDatas) AS 计费数据总数量;
需求3:筛选特定客户统计(比如VIP客户)
如果后续有VIP客户数据,想只统计VIP客户的订单和计费数据,只需加个WHERE条件:
SELECT k.KDX_Id, COUNT(DISTINCT b.BOO_Id) AS 订单数量, COUNT(bd.BIL_Id) AS 计费数据条数 FROM Kardex k LEFT JOIN Bookings b ON k.KDX_Id = b.BOO_ClientId LEFT JOIN BillableDatas bd ON b.BOO_Id = bd.BIL_BookingId WHERE k.KDX_VIP = 'Yes' GROUP BY k.KDX_Id;
内容的提问来源于stack exchange,提问作者user4307026
相关产品推荐
相关产品推荐

