Биллинговая система Nodeny

Главная категория => Курилка => Тема начата: Elisium от 22 Ноября 2011, 23:36:52



Название: Запрос на выборку полей из users и dopvalues
Отправлено: Elisium от 22 Ноября 2011, 23:36:52
Люди хелп )
Споткнулся под вечер об вроде бы несложную вещь:

Задача:
Необходимо выбрать пользователей из БД, у кого ип адреса находятся в диапазоне, допустим, like %192.168.16.% И У КОТОРЫХ присутствует ип адрес ПОСЛЕДНЕЙ РЕВИЗИИ в поле dopvalues.field_value с номером доп. поля dopvalues.dopfield_id = 6

Запрос на выборку значения из dopvalues с конкретным parent_id такой:
Код:
SELECT parent_id, field_value
FROM `dopvalues`
WHERE `dopfield_id` =6
AND `revision` = (
SELECT MAX( `revision` )
FROM `dopvalues`
WHERE `dopfield_id` =6
AND `parent_id`=ХХХ)
Выборка юзеров из диапазона вот:
Код:
SELECT id FROM `users` WHERE ip LIKE '%192.168.16.%'

КАК их обьединить, что бы на выходе получались ид юзеров с АКТУАЛЬНЫМИ field_value ??

Ломаю голову уже второй час, голова не железная же )
Хелп)


Название: Re: Запрос на выборку полей из users и dopvalues
Отправлено: VitalVas от 23 Ноября 2011, 02:41:13
left join?


Название: Re: Запрос на выборку полей из users и dopvalues
Отправлено: Elisium от 23 Ноября 2011, 21:46:53
Пробовал я его ))
Вот только не могу понять, как ид юзера правильно подставить из одного запроса во второй (то есть проверка dopvalues.parent_id=users.id)
Лефтджоинить нужно по ид (имхо), но вот только сначала нужно его же и подставить в запрос из допвалюес.
В общем, как это сделать без Перла, не догнал ...
На нем то просто. А вот однозапросный мускуль как ?

Ктото может подсказать ?
п.с. Я знаю, могут ) Пните нужным примером.
Стопудово ктото такое одним запросом делал уже.


Название: Re: Запрос на выборку полей из users и dopvalues
Отправлено: 0xbad0c0d3 от 23 Ноября 2011, 23:44:58
Ну, для начала прочитать маны )))
Код:
SELECT tbl1.* FROM tbl1 LEFT JOIN tbl2 ON tbl1.column=tbl2.column WHERE ...
Что-то типа этого. В ON можно юзать AND но не рекомендуется исп. ON для фильтра результатов, для этого есть WHERE


Название: Re: Запрос на выборку полей из users и dopvalues
Отправлено: Efendy от 30 Ноября 2011, 00:22:55
Код:
SELECT d.parent_id, v.field_value FROM
        (SELECT id FROM users WHERE ip LIKE '192.168.16.%') u
        LEFT JOIN (SELECT MAX(revision) AS rev,parent_id FROM dopvalues WHERE dopfield_id = 6 GROUP BY parent_id) d ON u.id = d.parent_id
        LEFT JOIN (SELECT revision,field_value FROM dopvalues ) v ON d.rev = v.revision
        WHERE v.field_value IS NOT NULL


Название: Re: Запрос на выборку полей из users и dopvalues
Отправлено: Elisium от 30 Ноября 2011, 23:12:01
ЕПРСТ товарисчи!!!
Этож на элементарную (по сути то) задачу пятиэтажный запрос нужно делать!!!
омг!!
Спасибо большое за ответ ...

п.с. ОЧЕНЬ НАДЕЮСЬ, что в новой версии биллинга не будет такого мозго*бства, уж извините за выражение ....(((((

п.п.с.
Не выводит этот запрос все равно то, что хотелось:
Цитировать
parent_id    field_value
128   
128   00:1f:1f:99:45:38
128   513
128   0
128   0
128   13
128   0
И таких строк около 2х тысяч.


Название: Re: Запрос на выборку полей из users и dopvalues
Отправлено: Elisium от 30 Ноября 2011, 23:37:58
Исправил запрос вот так:
Код:
SELECT d.parent_id, v.field_value
FROM (
SELECT id
FROM users
WHERE ip LIKE '192.168.16.%'
) u

LEFT JOIN (
SELECT MAX( revision ) AS rev, parent_id
FROM dopvalues
WHERE dopfield_id =6
GROUP BY parent_id
) d
ON u.id = d.parent_id

LEFT JOIN (
SELECT revision, field_value
FROM dopvalues
WHERE dopfield_id =6
)v
ON d.rev = v.revision
WHERE v.field_value != ""
Теперь поехало...
Спс за пинок в нужном направлении )


Название: Re: Запрос на выборку полей из users и dopvalues
Отправлено: Efendy от 01 Декабря 2011, 01:03:00
п.с. ОЧЕНЬ НАДЕЮСЬ, что в новой версии биллинга не будет такого мозго*бства, уж извините за выражение ....(((((


начиная с 49.33 в дополнительных данных нет ревизии (они в другой таблице), поэтому запросы гораздо проще там будут.