2010-12-09 3 views
2

У меня есть несколько таблиц (по одному на каждый день), которые имеют одну и ту же структуру: ID, srcIP, время.Как получить количество элементов для нескольких таблиц

я могу получить общее количество строк на каждый день, используя следующие:

SELECT 
    (SELECT COUNT(*) FROM Day1) as Day1Count, 
    (SELECT COUNT(*) FROM Day2) as Day2Count, 
    (SELECT COUNT(*) FROM Day3) as Day3Count 

Но это просто дает мне

Day1count Day1count Day1count 
102  148  131 

Но как я могу получить общее количество для каждого IP-адреса в день ? Не все IP-адреса присутствуют каждый день.

srcIP  D1 D2 D3 
172.16.0.1  99 34 
172.16.0.2 55  22 
172.16.0.3 47 49 75 

Заранее благодарен!

+0

Есть ли в «Day1» дневные журналы на каждый месяц? – 2010-12-09 16:13:18

+0

Да, всего три поля: ID, srcIP и время. – Nathan 2010-12-09 16:13:24

ответ

1

Чтобы получить отсчеты по ф и днем, самый простой способ, чтобы сгладить запрос:

SELECT 'day1' AS day, srcIP, count(*) AS count FROM Day1 GROUP BY srcIP 
UNION 
SELECT 'day2' AS day, srcIP, count(*) AS count FROM Day2 GROUP BY srcIP 
UNION 
SELECT 'day3' AS day, srcIP, count(*) AS count FROM Day3 GROUP BY srcIP 

, а затем перенести его в приложение, чтобы получить формат таблицы вы хотите.

Альтернативно

Вы также можете сделать это путем присоединения по IP:

SELECT srcIP, d1.count, d2.count, d3.count 
FROM (SELECT srcIP, count(*) AS count FROM Day1 GROUP BY srcIP) d1 
LEFT JOIN (SELECT srcIP, count(*) AS count FROM Day2 GROUP BY srcIP) d2 USING (srcIP) 
LEFT JOIN (SELECT srcIP, count(*) AS count FROM Day3 GROUP BY srcIP) d3 USING (srcIP) 

Но здесь будет отсутствовать IP-адреса, которые не в день1, если вы первый не делать SELECT DISTINCT srcIP из UNION всех дней, что довольно дорого. В принципе, эта структура таблицы не слишком легко поддается такому виду агрегации.

Смежные вопросы