Mysql 分组和/或工会是否合适?或者我应该只使用嵌套的SELECT吗?

Mysql 分组和/或工会是否合适?或者我应该只使用嵌套的SELECT吗?,mysql,sql,Mysql,Sql,我对“交叉引用”两列感兴趣,并返回两条信息: 列为saddr,daddr,sbytes,dbytes 我想找到DISTINCTsaddr并将它们与DISTINCTdaddr匹配,然后求和sbytes和dbytes 我还想简单地查找每个saddr每个daddr存在的记录数(给定一个daddrN个记录与此saddr匹配) 对于那些可能对上下文感兴趣的人,我将使用一个名为的包及其客户机来构建网络流量的数据库 谢谢 马特 [编辑] 样本数据: SELECT saddr,daddr,sbytes,dbyt

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

列为
saddr
daddr
sbytes
dbytes

我想找到
DISTINCT
saddr
并将它们与
DISTINCT
daddr
匹配,然后
求和
sbytes
dbytes

我还想简单地查找每个
saddr
每个
daddr
存在的记录数(给定一个
daddr
N个记录与此
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
预期结果:

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
我想我最难理解的是“它们都存在的地方”这一问题

[编辑二]

我的结论是,我只需要花时间阅读、理解并执行嵌套查询来获取我想要的信息。然而,如果任何人有任何更多的投入,将不胜感激

[编辑3] 解决方案:

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
是的

SELECT stime, saddr, daddr, SUM(sbytes), SUM(dbytes), count(saddr) FROM argus.argus2012K17 WHERE stime BETWEEN 1337187600 AND 1337187700 GROUP BY saddr, daddr;

假设这些构造可以提供您想要的结果,那么使用这些构造没有什么错。使用嵌套选择模拟它们将获得相同或更差的性能

我想你只需要这个:

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

为此,您需要一张驾驶台和一组驾驶员。SQL无法单独使用group by生成cnt为0的行:

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

此语句获取SADD和daddr的所有组合。然后将其与字节之和合并。当没有求和时,外部选择产生0。

您是否在问什么更为优化?还是最具可读性?或者最佳实践?我想我已经了解了你所问的关于
分组方式的问题,但是我不知道
联盟在这里的位置。谢谢凯瑟。我不太关心可读性,但优化(资源成本方面)和最佳实践都是我关心的问题。你的评论暗示有几种方法可以实现这一点,这很好,因为我根本不懂。吉尔卡:我想我认为一个选项是创建一个临时表,由嵌套查询填充,以进行查询,但是我认为
一样,与
删除
然后是
联合
相比,成本要低得多。如果包含一些样本数据和期望的结果,您可能会得到更好的响应。这将大大有助于澄清你的问题。例如,我不清楚你所说的“字节总和”是什么意思,尤其是因为你在做distinctHow,它是这样做的“…找到不同的saddr并将它们与不同的daddr匹配”。也没有From子句?我怀疑OP正在寻找包含以下内容的内容:
SELECT s.saddr,d.daddr From t s JOIN t d on s.saddr=d.daddr
,但问题还不够清楚。