вопрос по JOIN

maxon

Новичок
вопрос по JOIN

Имеется таблица со статистикой о IP трафике сл. структуры:

ID, orig_ip, dest_ip, size

, где orig_ip - адрес "откуда", dest_ip - адрес "куда", size - "количество байт"
Необходимо сформировать отчет об объеме входящего и исходящего трафика по каждому IP, присутствующему в вышеуказанной таблице. Структура таблицы требуемого отчета:

ip, out_size, inc_size

, где ip - IP адрес, out_size и inc_size - объем исходящего и входящего трафика соответственно

Запрос должен быть выполнен только средствами языка SQL.

Я решил использовать внешнее объеденение (по средствам UNION) блиц с результатами сл. запросов:

входящий трафик: SELECT term_ip, sum(size) FROM table GROUP BY term_ip

исходящий трафик: SELECT orig_ip, sum(size) FROM table GROUP BY orig_ip

Результатом будет следующая таблица:

ip inc_sum ip out_sum

Но проблема в том, ее формат не соответствует требуемому. Необходио получит таблицу в которой будет одно поле ip, содержащее данные обоих столбцов и этому полю будет соответствовать поля с inc_sum и out_sum.
 

alpine

Новичок
maxon
Результатом будет следующая таблица:
ip inc_sum ip out_sum

Это после UNION таблица с такими полями получилась?
Тоесть от нужной отличается только лишним полем ip?
 

maxon

Новичок
Да, причем если IP1 имел только исходящий, IP2 - только входящий, а IP3 - оба типа трафика, то таблица получается такая:

+---------------+-------+--------+-------+
| ip | sum | ip | sum |
+---------------+-------+--------+-------+
| IP1 | 1042 | NULL | NULL |
| NULL | NULL | IP2 | 2080 |
| IP3 | 1268 | IP3 | 1421 |
+----------------+-------+--------+-------+


Как бы наложить это дело друг на друга...
 

alpine

Новичок
maxon
Лично я не могу понять как ты получаешь ip inc_sum ip out_sum
написав:
( SELECT term_ip, sum(size) FROM table GROUP BY term_ip )
UNION
( SELECT orig_ip, sum(size) FROM table GROUP BY orig_ip )

-~{}~ 02.12.05 21:10:

или я гоню?
 

alpine

Новичок
chira
Может он выбирает во врменные таблицы а потом их заджоинивает?
 

maxon

Новичок
Вот конечный запрос:
SELECT * FROM `orig` LEFT JOIN `term` ON orig.orig_ip=term.term_ip UNION
SELECT * FROM `orig` RIGHT JOIN `term` ON orig.orig_ip=term.term_ip

А результаты тех двух запросов - это таблицы orig и term

-~{}~ 02.12.05 22:17:

Да иммено заджоиниваю:), поскольку внешнего join в мускуле не нашел.
 

chira

Новичок
повторюсь
Код:
SELECT a.ip, sum(a.term_size) out, sum(a.orig_size) inc
FROM (
(SELECT term_ip ip, sum(size) term_size, 0 orig_size FROM table GROUP BY term_ip)
UNION ALL
(SELECT orig_ip, 0, sum(size) FROM table GROUP BY orig_ip)) a
GROUP BY ip
-~{}~ 02.12.05 21:24:

Да иммено заджоиниваю:), поскольку внешнего join в мускуле не нашел.
заджонивает со звёздочкой, а потом UNION ...
 

maxon

Новичок
Супер, спасибо отдуши! Как думаешь, стоит делать эти временные таблицы или лучше сразу несколько вложений использовать? У меня очень большой объем данных. В секунду порядка 300 записей в оригинальную таблицу.
 

alpine

Новичок
chira
А такой запрос работать будет?
SELECT
term.ip, SUM(term.in), SUM(orig.out)
FROM (SELECT term_ip as ip, sum(size) as in FROM table GROUP BY term_ip) as term
LEFT JOIN (SELECT orig_ip as ip, sum(size) as out FROM table GROUP BY orig_ip) as orig ON term.ip = orig.ip
GROUP BY term.ip
 

maxon

Новичок
Этот выдаст только тем IP, которые имели только OUT трафик и по IP которые имели трафик OUT/INC.
IP чисто с INC трафиком остануться без внимания.
 

chira

Новичок
Как думаешь, стоит делать эти временные таблицы или лучше сразу несколько вложений использовать? У меня очень большой объем данных. В секунду порядка 300 записей в оригинальную таблицу.
делать нужно не временные, а суммарные
к примеру, по истечению суток, подсчитывать итоги и записывать в данные отдельную таблицу
 

maxon

Новичок
Автор оригинала: chira
делать нужно не временные, а суммарные
к примеру, по истечению суток, подсчитывать итоги и записывать в данные отдельную таблицу
Я собсно так и собираюсь. В конце суток, выполнять такой запрос. Я имел ввиду: есть ли разница между выполнением этого запроса используя готовые таблицы и генерированием этих таблице во вложенном запросе?
 

chira

Новичок
alpine

ты случаем не спишь? может куришь чего?
такие вопросы от тебя настораживают
Я правильно понял что LEFT JOIN ... USING(...) в 5-ке работает также как и INNER JOIN ?
почему в пятёрке должно поменяться поведение LEFT JOIN и стать INNER JOIN?
 
Сверху