MySQL - 如何合并来自两个表的数据,使用一个字段的值作为过滤器来计算另一个字段中的值?
MySQL - How to combine data from two tables, using the value of one field as the filter to count values in another?
我一直在为这个问题绞尽脑汁,解决方案可能很简单,但我就是想不通,到处搜索也找不到解决这个具体问题的方法。
我有两个 tables - 一个包含 IP 连接列表,例如:
Connections_Table
src dst
192.168.1.1 1.2.3.4
192.168.1.1 2.2.2.2
192.168.1.1 3.3.3.3
192.168.1.1 4.4.4.4
另一个table包含IP地址列表,例如:
Bad_Ip_Addresses_Table
ip
7.8.9.4
3.2.1.4
77.8.99.4
2.2.2.2
18.7.9.8
这里是我找不到如何构建此查询的地方...我正在尝试构建一个 table,它显示第一个 table 的 src 和 dst,以及第二个 table 包含来自第一个 table 的 dst。换句话说:
Results_Table
src dst match
192.168.1.1 1.2.3.4 0
192.168.1.1 2.2.2.2 1
192.168.1.1 3.3.3.3 0
192.168.1.1 4.4.4.4 0
这可能是最大的收获:我在 SO 上看到过一些帖子,其中解决方案涉及创建 table 和触发器。我做不到 - 这将是 AWS Kinesis Analytics SQL 声明:
Connections_Table 是实时提取的,Bad_Ip_Addresses_Table 是从 AWS S3 加载的 CSV。在摄取的每一行上,我需要对 CSV 执行 SQL 语句以查找 dst ip 是否在 CSV 中。
有什么建议吗?
您可以使用左连接并计数
select a.src, a.dst, count(b.ip)
from Connections_Table a
left join Bad_Ip_Addresses_Table b on a.dst = b.ip
group by a.src, a.dst
- 在MySQL中,你可以
Left Join
从Connections_Table
到Bad_Ip_Addresses_Table
,这样所有dst
考虑来自 Connections_Table
的值(无论是否存在匹配行)。
- 然后您可以在
src
和 dst
上 Group By
;并使用 Count()
函数来计算匹配项。注意Count(null) = 0
;所以不匹配的行将 return 0(因为会有 null
值 post 左连接)。
在 MySQL 中,尝试以下查询:
SELECT
ct.src,
ct.dst,
COUNT(biat.ip) AS match
FROM
Connections_Table AS ct
LEFT JOIN Bad_Ip_Addresses_Table AS biat ON biat.ip = ct.dst
GROUP BY ct.src, ct.dst
我一直在为这个问题绞尽脑汁,解决方案可能很简单,但我就是想不通,到处搜索也找不到解决这个具体问题的方法。
我有两个 tables - 一个包含 IP 连接列表,例如:
Connections_Table
src dst
192.168.1.1 1.2.3.4
192.168.1.1 2.2.2.2
192.168.1.1 3.3.3.3
192.168.1.1 4.4.4.4
另一个table包含IP地址列表,例如:
Bad_Ip_Addresses_Table
ip
7.8.9.4
3.2.1.4
77.8.99.4
2.2.2.2
18.7.9.8
这里是我找不到如何构建此查询的地方...我正在尝试构建一个 table,它显示第一个 table 的 src 和 dst,以及第二个 table 包含来自第一个 table 的 dst。换句话说:
Results_Table
src dst match
192.168.1.1 1.2.3.4 0
192.168.1.1 2.2.2.2 1
192.168.1.1 3.3.3.3 0
192.168.1.1 4.4.4.4 0
这可能是最大的收获:我在 SO 上看到过一些帖子,其中解决方案涉及创建 table 和触发器。我做不到 - 这将是 AWS Kinesis Analytics SQL 声明:
Connections_Table 是实时提取的,Bad_Ip_Addresses_Table 是从 AWS S3 加载的 CSV。在摄取的每一行上,我需要对 CSV 执行 SQL 语句以查找 dst ip 是否在 CSV 中。
有什么建议吗?
您可以使用左连接并计数
select a.src, a.dst, count(b.ip)
from Connections_Table a
left join Bad_Ip_Addresses_Table b on a.dst = b.ip
group by a.src, a.dst
- 在MySQL中,你可以
Left Join
从Connections_Table
到Bad_Ip_Addresses_Table
,这样所有dst
考虑来自Connections_Table
的值(无论是否存在匹配行)。 - 然后您可以在
src
和dst
上Group By
;并使用Count()
函数来计算匹配项。注意Count(null) = 0
;所以不匹配的行将 return 0(因为会有null
值 post 左连接)。
在 MySQL 中,尝试以下查询:
SELECT
ct.src,
ct.dst,
COUNT(biat.ip) AS match
FROM
Connections_Table AS ct
LEFT JOIN Bad_Ip_Addresses_Table AS biat ON biat.ip = ct.dst
GROUP BY ct.src, ct.dst