Mysql使用join打印各个组的总数

Mysql使用join打印各个组的总数,mysql,join,Mysql,Join,我正试图打印出设备组列表以及每个组中的设备总数。但是,当我运行下面的查询时,它只返回一个包含该组中设备总数的组 所以,我希望有人能指出我做错了什么 多谢各位 select distinct DG.DeviceGroupName as DeviceGroup, DG.DeviceGroupID as GroupID, DG.IsParent, DG.IsDynamic, count(distinct RN_DEVICE.DeviceID) as Device

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

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

多谢各位

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

你要找的是GROUPBY子句

写这样的陈述:

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,因为当你分组时它已经过时了。 DISTINCT和GROUP BY之间的区别是,DISTINCT删除重复的行是的,它对整行有效,而不仅仅是一列和GROUP BY折叠行。所以它也有同样的效果

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

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


我还删除了FROM子句中的子查询,原因很简单:

欢迎使用堆栈溢出。我删掉了一些过时的句子。不管你有多少经验。你被一个问题困住了,这就是你来这里的原因。这就是全部。另外,请避免使用“不起作用”这样的句子,因为当你没有发布准确的错误消息或至少你所说的“不起作用”时,这些句子无助于理解问题。在询问有关SQL的问题时,包含示例数据和所需结果几乎总是一个好主意。谢谢。太好了,你的回答是对的,当然你知道,谢谢你的解释。你能提供一个网站,帮助我提高MySQL查询的速度吗。再次感谢。对不起,不是我想的。我迅速完成了我的工作和stackoverflow:如果这个问题得到解决,请点击我答案左边的复选框,接受我的答案。