MySQL - Как объединить данные из двух таблиц, используя значение одного поля в качестве фильтра для подсчета значений в другой? - PullRequest
0 голосов
/ 26 октября 2018

Я ломал голову над этим, и решение, вероятно, очень простое, но я просто не могу понять это, искал везде и не могу найти решение этой конкретной проблемы.

У меня есть две таблицы - одна содержит список 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

Другая таблица содержит список 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

Здесь я не могу найти, как построить этот запрос ... Я пытаюсь создать таблицу, которая показывает src и dst из первой таблицы, и содержит ли 2-я таблица 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, где решение включает в себя создание таблицы и триггеров. Я не могу этого сделать - это будет оператор SQL AWS Kinesis Analytics:

Connections_Table загружается в прямом эфире, а Bad_Ip_Addresses_Table - это CSV, загруженный из AWS S3. В каждой загруженной строке мне нужно выполнить оператор SQL против CSV, чтобы определить, находится ли dst ip в CSV.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018
  • В MySQL вы можете Left Join от Connections_Table до Bad_Ip_Addresses_Table, так что учитываются все значения dst от Connections_Table (независимо от того, существует соответствующая строка или нет).
  • Затем вы можете Group By на src и dst;и используйте функцию Count() для подсчета совпадений.Обратите внимание, что Count(null) = 0;поэтому несовпадающие строки будут возвращать 0 (поскольку после левого соединения будут null значения).

В 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 
0 голосов
/ 26 октября 2018

Вы можете использовать левое соединение и считать

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
...