#1 09.02.08 20:03
sql запрос
хм.. люди, помогите человеку разобраться вот в чем.. SQL знаю не очень хорошо пока..
короче есть база на роутере, хранит пользовательский трафик, снятый с интерфейсов
нужно подсчитать весь трафик проходящий через интерфейс за день, но не учитывая трафик к роутеру
играемся с полями to_IP, from_IP, bytes из таблицы rl0_2008, ip роутера 192.168.0.250
пробовал делать что то вроде такого, не работает.. логика нарушена в запросе явно :(
Код::
SELECT SUM(bytes) FROM rl0_2008 WHERE date='2008-02-09' AND (from_IP!='192.168.0.250' OR to_IP!='192.168.0.250')
выдает явно не то, что ожидалось :(..
подскажите как правильно реализовать такую весчь.. новичок епта :)
Offline
#3 09.02.08 21:47
Re: sql запрос
CREATE TABLE \`${iface}_${year}\`
(\`unic_id\` INT(16) NOT NULL AUTO_INCREMENT, \
\`date\` DATE NOT NULL, \`time\` TIME NOT NULL, \
\`from_IP\` CHAR(16) NOT NULL, \`port_from_IP\` CHAR(8) NOT NULL, \
\`to_IP\` CHAR(16) NOT NULL, \`port_to_IP\` CHAR(8) NOT NULL, \
\`protocol\` ENUM('icmp','tcp','udp') NOT NULL, \`bytes\` int(16) NOT NULL, \
\`all_bytes\` int(16) NOT NULL, \
PRIMARY KEY (\`unic_id\`), \
KEY \`date\`(\`date\`)
извиняюсь, вставил как есть.. редактить некогда :)
Offline
#8 09.02.08 22:45
Re: sql запрос
если убрать скобки, выдает больше сумму, чем при запросе только по дате
получается типа сумма этого запроса
Код::
SELECT SUM(bytes) FROM rl0_2008 WHERE date='2008-02-09' AND from_IP!='192.168.0.250'
складывается с этим
Код::
SELECT SUM(bytes) FROM rl0_2008 WHERE to_IP!='192.168.0.250'
то есть там сумма всплывает за все дни О_о
Offline
#10 09.02.08 23:02
Re: sql запрос
Код::
|| 83650 | 2008-02-09 | 14:20:00 | 192.168.0.250 | 53 | 192.168.0.198 | client | udp | 3974 | 4534 | | 83677 | 2008-02-09 | 14:25:00 | 192.168.0.250 | 138 | 192.168.0.255 | 138 | udp | 9826 | 11282 | | 83678 | 2008-02-09 | 14:25:00 | 192.168.0.250 | 139 | 192.168.0.8 | client | tcp | 7283474 | 62385042 | | 83680 | 2008-02-09 | 14:25:00 | 192.168.0.8 | client | 192.168.0.250 | 139 | tcp | 1874377646 | 1927343854 | | 83703 | 2008-02-09 | 14:30:00 | 192.168.0.250 | 138 | 192.168.0.255 | 138 | udp | 3760 | 4320 | | 83704 | 2008-02-09 | 14:30:00 | 192.168.0.250 | 139 | 192.168.0.8 | client | tcp | 2161186 | 76651030 |
это часть ессно..
и ещ заметил такое О_о
Код::
| 83706 | 2008-02-09 | 14:30:00 | 192.168.0.8 | client | 192.168.0.250 | 139 | tcp | -1709202780 | -1636891580 |
Исправлено GreenDay (09.02.08 23:03)
Offline
#11 10.02.08 02:08
Re: sql запрос
rzk написал(а):
(from_IP<>'192.168.0.250' AND to_IP<>'192.168.0.250')
GreenDay написал(а):
если сделать как ты предлагаешь, он выдас NULL - ибо невозможно в одной строке совпадение to_IP и from_IP
выдаст строки, где from_IP и to_IP не равны '192.168.0.250'.
GreenDay написал(а):
| 83706 | 2008-02-09 | 14:30:00 | 192.168.0.8 | client | 192.168.0.250 | 139 | tcp | -1709202780 | -1636891580
попробуй int(32) в столбцах bytes и all_bytes
Исправлено rzk (10.02.08 03:35)
Offline
#12 10.02.08 02:10
#13 10.02.08 10:44
#14 10.02.08 11:57
Re: sql запрос
Тип полей from_IP и to_IP - char(16), максимум IP адрес может занимать 3х4 + 3 = 15 байт, это означает, что все IP адреса в этих полях дополняются пробелами. При сравнении это может дать ошибку. Можно попробовать:
1. Делать RTRIM
2. сделать тип полей IP varchar'ом
Попробуй
Offline
#15 10.02.08 14:20
#16 10.02.08 18:18
#17 13.02.08 22:47
#18 14.02.08 13:26
Re: sql запрос
rzk был прав.. я ступил... там AND все делается, так что все нормально.. все работает :)
но терь другая проблема, уже в php..
Код::
<?php
// вытаскиваем статистику по пользователям из БД
$sql = mysql_query("SELECT to_IP, SUM(bytes) AS `bytes` FROM
`" . $IF_internal_servera . "_" . date(Y,time()) . "` WHERE `date`
LIKE '" . $old_month . "-%' AND from_IP != '" . $ip_out_servera . "' AND
to_IP != '" . $ip_out_servera . "' AND `to_IP` != '" . $ip_internal_servera . "'
AND `from_IP` != '" . $ip_internal_servera . "' AND `to_IP` LIKE
'" . $lan_mask . "%' GROUP BY `to_IP` ORDER BY `bytes` DESC");
// Строим табличку по тем кого достали
// вытаскиваем рейтинг страниц из БД
while ($d = mysql_fetch_assoc($sql)) {
// собственно тут вывод результатов.
$bytes = $d['bytes'] /1048576;
$bytes = round($bytes, 2);
$user_name = $users [$d ['to_IP']];
if (!isset ($user_name))
$user_name = '<b>Неизвестный</b>';
?>еще запросы хочу прикрутить, чтобы отдельно ftp, http, icq, smtp, pop трафик считать, запросы то сами запросто сделать могу.. а вот как в цикл прикрутить эту весчь хз.. в php пока что ламер, скрипты не мои.. переделываю :)
Исправлено GreenDay (14.02.08 13:28)
Offline

