Здравствуйте господа. С этим биллингом познакомился недавно, посему, возможно, спрошу что-то тривиальное. Помогите плз с запросом, требуется вывести клиентов в такой вот форме:
Полное_имя IP(в виде ххх.ххх.ххх.ххх/32) login входящий_траф Исходящий_траф
Не могу понять как именно хранятся в базе ИП и маски, если просто использую функцию inet_ntoa то появляется ошибка в адресе сети, но нет ошибки в отдельном адресе, если подгоняю под сеть то появляется ошибка в единичном адресе(с маской 32).
Положим запрос:
SELECT
us.login login,
ig.id,
ig.ip_group_id,
GROUP_CONCAT(concat_ws( "/",inet_ntoa(ig.ip & 0xffffffff),inet_ntoa(ig.mask & 0xffffffff))) ip
FROM ip_groups ig
INNER JOIN service_links sl
ON sl.id = ig.ip_group_id
INNER JOIN users us
ON us.id = sl.user_id
WHERE
ig.is_deleted=0
GROUP BY
login;
Подготовительный для обработки возвращает правильные единичные адреса и ошибается в адресах сетей на +1. Например: сеть которая показана в админке биллинга - 192.168.100.0/24 а запрос выдает 192.168.101.0/255.255.255.0
Может кто может помочь...
SQL и БД UTM5
- Chrst
- Сообщения: 370
- Зарегистрирован: Пт май 11, 2007 09:28
- Откуда: Медиахолдинг "ЛеККС"
- Контактная информация:
Re: SQL и БД UTM5
Могу предположить, что по запросу возвращается первый доступный адрес из диапазона. 192.168.100.0 идентификатор сети и адресом как таковым не является.srusv писал(а):Подготовительный для обработки возвращает правильные единичные адреса и ошибается в адресах сетей на +1. Например: сеть которая показана в админке биллинга - 192.168.100.0/24 а запрос выдает 192.168.101.0/255.255.255.0
Может кто может помочь...
Re:Re:
Да нет, СУБД ведь не учитывает первый возможный, и функция inet_ntoa тоже для этого не предусмотрена. Да и возвращаться наверное должна не первая возможная сеть 
вот запрос, который в целом должен получиться, но так и не понял как избавиться от этой ошибки непонятной.
SELECT 'Login','FullName','Bytes IN','Bytes OUT','Account ID','User ID','IP-addr','Server','DT'
UNION ALL
SELECT
users.login,
users.full_name,
ifnull(sum(trans.bytes_in),0),
ifnull(sum(trans.bytes_out),0),
trans.account_id,
users.id,
( SELECT
GROUP_CONCAT(concat_ws( "/",inet_ntoa(ig.ip & 0xffffffff),inet_ntoa(ig.mask & 0xffffffff))) ip
FROM ip_groups ig
INNER JOIN service_links sl
ON sl.id = ig.ip_group_id
INNER JOIN users us
ON us.id = sl.user_id
WHERE
us.id = users.id
and ig.is_deleted=0) as IP_add,
'"utm5-m9"',
FROM_UNIXTIME(trans.discount_date_day,'%Y%m')
FROM
(SELECT case t_class when 10 then bytes else null end bytes_in,
case t_class when 20 then bytes else null end bytes_out, account_id,discount_date,
discount_date_day
FROM UTM5arc.dti_2011_10
WHERE
discount_date>='1317416400' AND
discount_date <'1320091199')
trans left join users_accounts ua
on trans.account_id=ua.account_id
left join users on ua.uid=users.id
left join ip_groups on users.id=ip_groups.ip_group_id
where users.login is not NULL
GROUP BY users.login;

вот запрос, который в целом должен получиться, но так и не понял как избавиться от этой ошибки непонятной.
SELECT 'Login','FullName','Bytes IN','Bytes OUT','Account ID','User ID','IP-addr','Server','DT'
UNION ALL
SELECT
users.login,
users.full_name,
ifnull(sum(trans.bytes_in),0),
ifnull(sum(trans.bytes_out),0),
trans.account_id,
users.id,
( SELECT
GROUP_CONCAT(concat_ws( "/",inet_ntoa(ig.ip & 0xffffffff),inet_ntoa(ig.mask & 0xffffffff))) ip
FROM ip_groups ig
INNER JOIN service_links sl
ON sl.id = ig.ip_group_id
INNER JOIN users us
ON us.id = sl.user_id
WHERE
us.id = users.id
and ig.is_deleted=0) as IP_add,
'"utm5-m9"',
FROM_UNIXTIME(trans.discount_date_day,'%Y%m')
FROM
(SELECT case t_class when 10 then bytes else null end bytes_in,
case t_class when 20 then bytes else null end bytes_out, account_id,discount_date,
discount_date_day
FROM UTM5arc.dti_2011_10
WHERE
discount_date>='1317416400' AND
discount_date <'1320091199')
trans left join users_accounts ua
on trans.account_id=ua.account_id
left join users on ua.uid=users.id
left join ip_groups on users.id=ip_groups.ip_group_id
where users.login is not NULL
GROUP BY users.login;
появилось подозрение
Появилось одно подозрение, если для вычисления ип-адреса сете пользоваться конструкцией типа inet_ntoa(ip+mask & 0xffffffff) получаем первый адрес из указанной сети. надо проверять. проверю, свой результирующий запросик отпишу.
Также, наткнулся на еще одну непонятность, в админке по одному из клиентов показывается что ему адреса не описаны, а только впн, а при выборке - они откуда-то берутся ... короче буду гонять тесты дальше...

Также, наткнулся на еще одну непонятность, в админке по одному из клиентов показывается что ему адреса не описаны, а только впн, а при выборке - они откуда-то берутся ... короче буду гонять тесты дальше...
