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
,但问题还不够清楚。