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 JoinConnections_TableBad_Ip_Addresses_Table,这样所有dst考虑来自 Connections_Table 的值(无论是否存在匹配行)。
  • 然后您可以在 srcdstGroup 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