Помогите с хитрым SQL-запросом

Технические вопросы по UTM 5.0
Ответить
wingman
Сообщения: 136
Зарегистрирован: Чт дек 07, 2006 15:36
Контактная информация:

Помогите с хитрым SQL-запросом

Сообщение wingman »

Прошу прощения за офтоп, но нужна помощь с SQL-запросом =)

Собственно, сам запрос:

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

SELECT users.id as uid, users.login, users.basic_account AS aid, accounts.is_blocked, users.full_name, accounts.balance, accounts.credit,
        (
        SELECT GROUP_CONCAT(inet_ntoa( ip_groups.ip & 0xffffffff ))
        FROM  ip_groups, iptraffic_service_links, service_links, users
        WHERE ip_groups.ip_group_id=iptraffic_service_links.ip_group_id
        AND service_links.id=iptraffic_service_links.id
        AND service_links.account_id=users.basic_account
        AND users.id=uid
        AND users.is_deleted=0
        AND service_links.is_deleted=0
        AND ip_groups.is_deleted=0
        ) AS uip
FROM users
INNER JOIN accounts ON accounts.id=users.basic_account
INNER JOIN service_links ON service_links.account_id = users.basic_account
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 users.is_deleted=0
AND accounts.is_deleted=0
AND iptraffic_service_links.is_deleted=0
AND ip_groups.is_deleted=0
$wh
ORDER BY $ord
LIMIT $start, $limit
При отладке можно убрать order & limit, а в "$wh" вставить, например, 'AND users.id=111'



Назначение запроса - вытаскивать инфу о юзере (и список юзеров), основываясь на любом из полей БД UTM5 + самодописанных, причем необходимо делать это именно одним запросом.
Короче, тупо поиск =)

Косяк в том, что в случае, если ip-групп у данного юзера больше, чем 1, то rows возвращается столько, сколько у него ip-групп. Соответственно, при простом выводе списка даже без доп. "$wh", выводятся дублирующие записи

Помогите сформировать запрос пограмотнее, заранее благодарю =)

wingman
Сообщения: 136
Зарегистрирован: Чт дек 07, 2006 15:36
Контактная информация:

Re: Помогите с хитрым SQL-запросом

Сообщение wingman »

Вопрос снят, `SELECT DISTINCT` ;))

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

Сообщение dk »

Зачем вложенный запрос? на порядок, а то и два, быстрее будет:

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

SELECT users.id as uid, users.login, users.basic_account AS aid, accounts.is_blocked, users.full_name, accounts.balance, accounts.credit, GROUP_CONCAT(inet_ntoa( ip_groups.ip & 0xffffffff ))
FROM users
INNER JOIN accounts ON accounts.id=users.basic_account
INNER JOIN service_links ON service_links.account_id = users.basic_account
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 users.is_deleted=0
AND accounts.is_deleted=0
AND iptraffic_service_links.is_deleted=0
AND ip_groups.is_deleted=0
GROUP BY users.id, users.login, users.basic_account, accounts.is_blocked, users.full_name, accounts.balance, accounts.credit
;

wingman
Сообщения: 136
Зарегистрирован: Чт дек 07, 2006 15:36
Контактная информация:

Сообщение wingman »

Спасибо большое, действительно шустрее =)

Такой вот красивый запрос получился ;Р

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

$sth = $UDBH->prepare("
SELECT users.id as uid, users.login, users.basic_account AS aid, accounts.is_blocked, users.full_name, accounts.balance, accounts.credit, GROUP_CONCAT(inet_ntoa( ip_groups.ip & 0xffffffff ))
FROM users
LEFT JOIN accounts ON accounts.id=users.basic_account
LEFT JOIN service_links ON service_links.account_id = users.basic_account AND service_links.is_deleted=0
LEFT JOIN iptraffic_service_links ON iptraffic_service_links.id = service_links.id AND iptraffic_service_links.is_deleted=0
LEFT JOIN ip_groups ON ip_groups.ip_group_id = iptraffic_service_links.ip_group_id AND ip_groups.is_deleted=0
WHERE users.is_deleted=0
$wh
GROUP BY users.id, users.login, users.basic_account, accounts.is_blocked, users.full_name, accounts.balance, accounts.credit 
ORDER BY $sidx $sord
LIMIT $start, $limit
");

Ответить