Есть таблица хранящая данные о трафике, структура таблицы следующая:
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 |
+-------+----------+----------+----------+----------+-----------+-----------+-----------+-----------+Или это не возможно и для каждого протокола придется формировать новый запрос?