SQL запрос. Выборка услуг по IP

Технические вопросы по UTM 5.0
Ответить
Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

SQL запрос. Выборка услуг по IP

Сообщение Kayfolom »

Ломаю тут голову на сабжевым запросом. Получилось монстроидально:

Код: Выделить всё

SELECT
service_links.service_id
FROM service_links
WHERE service_links.is_deleted=0 AND
service_links.account_id=
(SELECT
service_links.account_id
FROM
service_links
INNER JOIN iptraffic_service_links ON iptraffic_service_links.id = service_links.id
INNER JOIN ip_groups ON ip_groups.ip_group_id = iptraffic_service_links.ip_group_id
WHERE
ip_groups.is_deleted = 0 AND
iptraffic_service_links.is_deleted = 0 AND
service_links.is_deleted = 0 AND
INET_NTOA(ip_groups.ip & 4294967295) = '10.0.0.25')
Может кто ткнет меня в более изящную реализацию?
Нужно выбрать все периодические (в том числе и не включенные в тарифы) услуги навешанные на пользователя по IP...

Аватара пользователя
kamae1ka
Сообщения: 142
Зарегистрирован: Пн окт 04, 2010 05:14

Сообщение kamae1ka »

ну в принципе то выполняется довольно быстро

Kayfolom
Сообщения: 746
Зарегистрирован: Вс фев 12, 2006 17:15

Сообщение Kayfolom »

Как раз выполняется очень медленно :( Вложенные запросы, плюс джоины - худшее что можно придумать.
Этим запросом буду авторизовывать клиентов на сервере middleware, запросов ожидается по десятку в секунду.
Структура базы нетапа вставляет не по детски :(
Наверное разобью на два отдельных запроса.

dk
Сообщения: 424
Зарегистрирован: Чт авг 10, 2006 08:52

Сообщение dk »

В этом случае вложенный запрос ничего не портит, разбивать смысла нет. Сделать запрос без этого можно, но без индексов он будет менее эффективен.

Код: Выделить всё

SELECT
a.service_id
FROM 
ip_groups, iptraffic_service_links, service_links b, service_links a
WHERE
a.is_deleted=0 AND
b.is_deleted = 0 AND
ip_groups.is_deleted = 0 AND
a.account_id=b.account_id AND
iptraffic_service_links.id = b.id AND
ip_groups.ip_group_id = iptraffic_service_links.ip_group_id AND
iptraffic_service_links.is_deleted = 0 AND
INET_NTOA(ip_groups.ip & 0xFFFFFFFF) = '1.2.3.4';

Ответить