Есть таблица хранящая данные о трафике, структура таблицы следующая:
create table traffic
(
/* хранит время выгрузки */
date datetime not null,
/* IP источника (0 - клиент, -1 - не используется) */
srcIp int unsigned not null,
/* IP назначения (0 - клиент, -1 - не используется) */
dstIp int unsigned not null,
/* порт источника */
srcPort int not null,
/* порт назначения */
dstPort int not null,
/* протокол (1 - tcp, 2 - udp, 3 - icmp, 4 - igmp, -1 - unkn) */
protoID tinyint not null,
/* количество данных */
bytes int not null,
/* полный размер */
psize int not null,
primary key (date, srcIp, dstIp, srcPort, dstPort, protoID),
index (bytes), index (psize)
) type = MyISAM;
Вот как это выглядит:
mysql> SELECT * FROM traffic LIMIT 5;
+---------------------+------------+------------+---------+---------+---------+----------+----------+
| date | srcIp | dstIp | srcPort | dstPort | protoID | bytes | psize |
+---------------------+------------+------------+---------+---------+---------+----------+----------+
| 2009-04-22 09:16:37 | 3232269169 | 3232269311 | 0 | 694 | 2 | 12363688 | 14337688 |
| 2009-04-22 09:16:37 | 3232269176 | 3232269311 | 0 | 694 | 2 | 12299337 | 14273281 |
| 2009-04-22 09:16:37 | 3232269325 | 3232269567 | 0 | 137 | 2 | 3945350 | 6154746 |
| 2009-04-22 09:16:37 | 3232240919 | 3232241011 | 0 | 22 | 1 | 2729744 | 3899848 |
| 2009-04-22 09:16:37 | 3232241011 | 3232240919 | 22 | 0 | 1 | 2266208 | 3367464 |
+---------------------+------------+------------+---------+---------+---------+----------+----------+
5 rows in set (0.00 sec)Чтобы мне подсчитать количество 'TCP' трафика по каждому IP я формирую следующий запрос:
mysql> SELECT DISTINCT srcIp, SUM(bytes) AS bytesTCP, SUM(psize) AS psizeTCP
-> FROM traffic
-> WHERE protoID = 1
-> GROUP BY srcIp
-> ORDER BY psizeTCP DEST
-> LIMIT 5;
+------------+------------+------------+
| srcIp | bytesTCP | psizeTCP |
+------------+------------+------------+
| 3232241011 | 3464714668 | 3597061424 |
| 3232240655 | 452955261 | 472668361 |
| 3232240790 | 148848479 | 154294187 |
| 1596266742 | 51989241 | 61140709 |
| 3232240919 | 22654422 | 33675174 |
+------------+------------+------------+
5 rows in set (0.01 sec)Чтобы подсчитать то же самое только по 'UDP' трафику в значении
WHERE protoID = 1 надо подставить номер протокола 'UDP', то есть заменить '1' на '2'. Подсчет других протоколов так же ничем не отличается.
Вопрос вот в чем, как мне составить запрос, что бы на выходе я получил значения по всем протоколам, то есть, что бы на выходе я имел следующую таблицу:
+-------+----------+----------+----------+----------+-----------+-----------+-----------+-----------+
| srcIp | bytesTCP | psizeTCP | bytesUDP | psizeUDP | bytesICMP | psizeICMP | bytesFULL | psizeFULL |
+-------+----------+----------+----------+----------+-----------+-----------+-----------+-----------+Или это не возможно и для каждого протокола придется формировать новый запрос?