You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用MySQL统计三张关联表中的元素数量

嗨,我来帮你搞定这个MySQL多表统计的问题~先把你的表结构整理得更清晰些,方便我们分析关联关系:

你的三张表结构

Kardex表(客户信息表)

KDX_IdKDX_VIPKDX_Regular
1NoNo
2NoNo

BillableDatas表(计费数据表)

BIL_IdBIL_BookingId
199
299
3100

Bookings表(订单表)

BOO_IdBOO_ClientId
991
1002

从字段能看出来关联逻辑: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:24:17