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