Mysql 使用 join 打印出各个组的总计

Mysql using join to print out totals for individual groups

我正在尝试打印设备组列表和每个组中的设备总数。但是,当我 运行 下面的查询时,它只有 returns 一组,该组中的设备总数。

所以,如果有人能够指出我做错了什么,我将不胜感激。

谢谢。

select
    distinct DG.DeviceGroupName as DeviceGroup,
    DG.DeviceGroupID as GroupID,
    DG.IsParent,
    DG.IsDynamic,
    count(distinct RN_DEVICE.DeviceID) as DeviceAmount

from RN_DEVICE
    join RN_DEVICE_GROUP_DEVICE_MAP DG_MAP
            on RN_DEVICE.DeviceID   = DG_MAP.DeviceID

    join (
            SELECT DeviceGroupName, DeviceGroupID, IsParent, IsDynamic
            FROM RN_DEVICE_GROUP
    ) as DG on DG.DeviceGroupID = DG_MAP.DeviceGroupID

where RN_DEVICE.ManagementStatus <> 2
and DG.IsParent <> 0
order by DG.DeviceGroupName

您要查找的是 GROUP BY 子句。

这样写语句:

SELECT
    DG.DeviceGroupName as DeviceGroup,
    DG.DeviceGroupID as GroupID,
    DG.IsParent,
    DG.IsDynamic,
    COUNT(distinct RN_DEVICE.DeviceID) as DeviceAmount
FROM 
    RN_DEVICE
    JOIN RN_DEVICE_GROUP_DEVICE_MAP AS DG_MAP ON RN_DEVICE.DeviceID = DG_MAP.DeviceID
    JOIN RN_DEVICE_GROUP AS DG ON DG.DeviceGroupID = DG_MAP.DeviceGroupID
WHERE 
    RN_DEVICE.ManagementStatus <> 2
    AND DG.IsParent <> 0
GROUP BY 
    DG.DeviceGroupName,
    DG.DeviceGroupID,
    DG.IsParent,
    DG.IsDynamic

我删除了 DISTINCT,因为当您执行 GROUP BY 时它已经过时了。
DISTINCTGROUP BY 之间的区别是,DISTINCT 删除重复行(是的,它适用于整行,而不仅仅是一列)和 GROUP BY 种 "collapses" 行。所以它具有相同的效果。

但是,这也是我在 GROUP BY 子句中包含这么多列的原因。 MySQL 允许在 GROUP BY 子句中只写一列,但选择更多。这是错误的,经常让初学者感到困惑。 (这也是为什么这将在未来版本中更改的原因)。

您始终必须命名 GROUP BY 子句中的每一列,您也在 SELECT 子句中使用这些列,但您正在对其应用聚合函数的列除外。如果您不这样做,将显示每个组中的 随机 行!

我还删除了 FROM 子句中的子查询,只是因为它是不必要的:)