MySQL技术问询:两次内连接后GROUP BY外部引用及存储路径重复问题
解决MySQL查询中storagePath重复的问题
根据你描述的情况——用了DISTINCT但仍出现计算机名+盘符的重复,结合历史表(rqDiskdrivesHist)和两次内连接的场景,我来拆解问题并给出具体解决方案:
为什么DISTINCT没解决重复?
DISTINCT是对整行数据去重,只要usedMB或sizeMB有差异(比如同一盘符在不同时间点的剩余空间不同),整行就会被判定为不同,导致storagePath重复。要解决这个问题,得针对assetname+caption的组合做分组或筛选,而不是依赖整行去重。
具体解决方案
场景1:历史表有多条时间记录,需要取最新数据
如果rqDiskdrivesHist有时间戳字段(比如recordTime),直接用窗口函数筛选每个盘符的最新记录:
SELECT 'ServerDrive' as storageType, CONCAT(assetname, '\\', caption) as storagePath, ((size - freespace)/1024/1024) as usedMB, (size/1024/1024) as sizeMB FROM ( SELECT assetname, caption, size, freespace, -- 按计算机名+盘符分组,取最新时间的记录 ROW_NUMBER() OVER (PARTITION BY assetname, caption ORDER BY recordTime DESC) as rn FROM rqDiskdrivesHist -- 把你的两次内连接放到子查询里,避免提前放大数据 JOIN lanswee表 ON rqDiskdrivesHist.关联字段 = lanswee表.关联字段 JOIN 另一连接表 ON rqDiskdrivesHist.关联字段 = 另一连接表.关联字段 ) t WHERE rn = 1;
场景2:不需要历史记录,只需保留唯一盘符的聚合数据
如果同一盘符有多条记录,你可以对数值字段做聚合(比如取平均值、最大值),再按盘符分组:
SELECT 'ServerDrive' as storageType, CONCAT(assetname, '\\', caption) as storagePath, -- 可根据需求替换成MAX/MIN/AVG MAX((size - freespace)/1024/1024) as usedMB, MAX(size/1024/1024) as sizeMB FROM rqDiskdrivesHist JOIN lanswee表 ON rqDiskdrivesHist.关联字段 = lanswee表.关联字段 JOIN 另一连接表 ON rqDiskdrivesHist.关联字段 = 另一连接表.关联字段 GROUP BY assetname, caption;
场景3:内连接引入重复数据
如果两次内连接的表存在一对多关系(比如lanswee表有重复的assetname记录),先对连接表做去重再关联:
SELECT 'ServerDrive' as storageType, CONCAT(t1.assetname, '\\', t2.caption) as storagePath, ((t2.size - t2.freespace)/1024/1024) as usedMB, (t2.size/1024/1024) as sizeMB FROM ( -- 先对lanswee表去重,保留唯一的assetname记录 SELECT DISTINCT assetname, 其他需要的字段 FROM lanswee表 ) t1 JOIN rqDiskdrivesHist t2 ON t1.assetname = t2.assetname JOIN ( -- 对第二个连接表也做去重处理 SELECT DISTINCT 关联字段, 其他需要的字段 FROM 另一连接表 ) t3 ON t2.关联字段 = t3.关联字段 -- 最后按计算机名+盘符分组,确保唯一 GROUP BY t1.assetname, t2.caption;
内容的提问来源于stack exchange,提问作者Iason
相关产品推荐
相关产品推荐

