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

时间:2015-03-07 19:31:38

标签: mysql join

我正在尝试打印出设备组列表以及每个组中的设备总数。但是,当我运行以下查询时,它只返回一个组,其中包含该组中的设备总数。

所以,我希望有人能够指出我做错了什么。

谢谢。

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

1 个答案:

答案 0 :(得分:0)

您正在寻找的是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种类的“崩溃” “行。所以它有同样的效果。

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

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

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