我正在尝试打印出设备组列表以及每个组中的设备总数。但是,当我运行以下查询时,它只返回一个组,其中包含该组中的设备总数。
所以,我希望有人能够指出我做错了什么。
谢谢。
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
答案 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
时它已经过时了
DISTINCT
和GROUP BY
之间的区别在于,DISTINCT
删除了重复的行(是的,它适用于整行,而不仅仅是一列)和GROUP BY
种类的“崩溃” “行。所以它有同样的效果。
但是,这也是我在GROUP BY
子句中包含这么多列的原因。 MySQL允许在GROUP BY
子句中只写一列,但选择更多。这是错误的,经常让初学者感到困惑。 (这也是为什么在将来的版本中会改变的原因)。
您始终必须在GROUP BY
子句中为每个列命名,您在SELECT
子句中也使用该列,除了您正在应用聚合函数的那些列。如果您不这样做,将显示每个组的随机行!
我还删除了FROM
子句中的子查询,只是因为它是不必要的:)