我有三张桌子,
tbl_1-
ip |isp |infection
----------------------
1 |aaaa |malware
2 |bbbb |malware
3 |cccc |ddos
3 |cccc |trojan
4 |dddd |ddos
tbl_2-
ip |isp |infection
----------------------
1 |aaaa |malware
3 |cccc |ddos
4 |dddd |trojan
5 |eeee |trojan
6 |ffff |other
tbl_3-
ip |isp |infection
----------------------
1 |aaaa |ddos
6 |ffff |
2 |bbbb |other我需要得到如下结果,
result-
ip |isp |infection |ipCount |ispCount |infectionCount
--------------------------------------------------------------
1 |aaaa |malware |3 |3 |2
1 |aaaa |ddos |3 |3 |1
2 |bbbb |other |2 |2 |1
2 |bbbb |malware |2 |2 |1
3 |cccc |ddos |3 |3 |2
3 |cccc |trojan |3 |3 |1
4 |dddd |ddos |2 |2 |1
4 |dddd |trojan |2 |2 |1
5 |eeee |trojan |1 |1 |1
6 |ffff |other |2 |2 |1
6 |ffff | |2 |2 |1
ipCount, ispCount -> count of matching ip and isp
eg-there are 3 records with ip = 1 and isp = aaaa
infectionCount -> count of matching infections per ip and isp
eg-there are 2 infections that says malware where ip = 1 and isp = aaaa我想我需要一个嵌套的查询,但是我不知道如何用两个条件来计数;您能帮忙吗?
编辑:我尝试过的代码,
SELECT ip, isp, infection, count(ip), count(isp), count(infection)
FROM (
SELECT ip, isp, infection
FROM tbl_1
UNION ALL
SELECT ip, isp, infectionType
FROM tbl_2
UNION ALL
SELECT ip, isp, infection
FROM tbl_3
)x
GROUP BY ip, isp, infection但是它没有给出我想要的结果,因为我不知道如何在一个查询中进行两种类型的计数
发布于 2012-11-07 07:33:21
您需要对列infection和(ip & ipc)进行不同的分组,然后使用以下子查询连接它们:
SELECT t1.ip, t1.isp, t2.infection, t1.ipc, t1. ispc, t2.incount
FROM
(SELECT ip, isp, infection, COUNT(ip) as ipc, COUNT(isp) as ispc
FROM (
SELECT ip, isp, infection
FROM tbl1
UNION ALL
SELECT ip, isp, infection
FROM tbl2
UNION ALL
SELECT ip, isp, infection
FROM tbl3
)x
GROUP BY ip, isp) t1
JOIN
(SELECT ip, isp, infection, COUNT(infection) as incount
FROM (
SELECT ip, isp, infection
FROM tbl1
UNION ALL
SELECT ip, isp, infection
FROM tbl2
UNION ALL
SELECT ip, isp, infection
FROM tbl3
)x
GROUP BY ip, isp, infection)t2
ON t1.ip = t2.ip
ORDER BY ip, isp, infection Desc参见此SQLFiddle
注:我认为您想要的输出是错误的,因为:
Table3中,ip=6没有infection,但是它在输出中infection other (而不是malware)发布于 2012-11-07 07:01:40
可以将所有表合并在一起,然后根据特定列对列和进行分组。
SELECT ip, isp, infection, COUNT(ip) AS ipcount, COUNT(isp) AS ispcount, COUNT(infection) AS infectioncount
FROM
(
SELECT ip, isp, infection
FROM table_1
UNION ALL
SELECT ip, isp, infection
FROM table_2
UNION ALL
SELECT ip, isp, infection
FROM table_3
)
GROUP BY ip, isp, infection
ORDER BY ip, isp, infection;https://stackoverflow.com/questions/13264581
复制相似问题