GROUP BY和/或UNION是否合适?或者我应该只使用嵌套的SELECT?

时间:2012-05-23 15:10:23

标签: mysql sql

我感兴趣的是“交叉引用”两列并返回两条信息:

列为saddrdaddrsbytesdbytes

我想找到DISTINCT saddr并将其与DISTINCT daddr匹配,然后SUM sbytes和{{1} }。

我还想简单地找到每dbytessaddr存在的记录数(给定daddr N条记录与此daddr匹配。)

对于那些可能对上下文感兴趣的人,我使用名为argus的程序包及其客户端rasqlinsert来构建网络流量数据库。

谢谢,

马特

[编辑]

示例数据:

saddr

期望的结果:

SELECT saddr,daddr,sbytes,dbytes FROM argus.argus2012K17 limit 5;

   '01:80:c2:00:00:0a', '20:fd:f1:74:36:96', 194, 0
   '01:80:c2:00:00:0a', '20:fd:f1:74:36:b6', 194, 0
   '192.168.100.11', '212.243.210.210', 120, 120
   '192.168.100.11', '212.243.210.210', 422, 3667
   '192.168.100.23', '99.248.99.240', 132, 0

我认为我最难以绕过查询的“它们都存在的地方”。

[EDIT2]

我的结论是,我只需要花时间阅读并理解GROUP BY并执行嵌套查询以获取我想要的信息。但是,如果有人有任何更多的意见,我们将不胜感激。

[编辑3] 解决方案:

saddr, daddr, how many records found where they both exist, sum of all sbytes in these records, sum of all dbytes in these records

    '01:80:c2:00:00:0a', '20:fd:f1:74:36:96', 2, 388, 0
    '192.168.100.11', '212.243.210.210', 2, 542, 3787
    '192.168.100.23', '99.248.99.240', 1, 132, 0

返回:

SELECT saddr, daddr, SUM(sbytes), SUM(dbytes), count(saddr) FROM argus.argus2012K17 GROUP BY saddr, daddr;

地狱呀。

SELECT saddr, daddr, SUM(sbytes), SUM(dbytes), count(saddr) FROM argus.argus2012K17 where saddr='01:80:c2:00:00:0a' GROUP BY saddr, daddr;
    '01:80:c2:00:00:0a', '20:fd:f1:74:36:96', 326114, 0, 1681
    '01:80:c2:00:00:0a', '20:fd:f1:74:36:b6', 326114, 0, 1681

2 个答案:

答案 0 :(得分:1)

使用这些结构没有任何问题,假设它们可以为您提供所需的结果。使用嵌套的SELECT模拟它们会给你相同或更差的性能。

我认为你只需要这个:

SELECT saddr, daddr, SUM(bytes) GROUP BY saddr, daddr

答案 1 :(得分:0)

要做到这一点,你需要一个驾驶表和一组。 SQL无法单独使用该组生成具有0 cnt的行:

select driver.saddr, driver.daddr, coalesce(t.sumbytes) as bytes
from (select saddr, daddr
      from (select distinct saddr from t) cross join
           (select distinct daddr from t)
     ) driver left outer join
     (select saddr, daddr, sum(byets) as sumbytes
      from t
      group by saddr, daddr
     ) as tsum
     on t.saddr = tsum.saddr and t.daddr = tsum.daddr

此声明获得saddr和daddr的所有组合。然后它将它加到字节的总和。当没有总和时,外部选择产生0。