Как сделать запрос

NECTIS
Дата: 23.08.2004 20:55:03
привет всем,

есть некая таблица, в которой каждая запись имеет колонку с клиентским ID и его IP адресом:
ID | NAME | IP
1 | QWER | 1.1.1.1
2 | ASDF | 2.1.2.2
1 | QWER | 1.2.3.3
4 | HJKL | 123.2.1.1
1 | QWER | 3.4.21.1

Kаждый клиент может иметь несколько IP адресов, и поэтому если я делаю выборку по ID клиента, я получаю результат в виде таблицы с несколькими строками.
ID | NAME | IP
1 | QWER | 1.1.1.1
1 | QWER | 1.2.3.3
1 | QWER | 3.4.21.1

Мне нужно сделать запрос где IP адрес идёт в качестве ключевого аргумента и по нему определяется клиентский ID:
Скажем
SELECT * FROM test WHERE IP=(ip1 OR ip2 OR ip3)

Подскажите пожалуйста как такое сделать.
Саму структуру таблицы поменять не могу - не мной написано, а вот запрос сделать очень надо...

С уважением
nevermind
Дата: 24.08.2004 12:24:10
Что значит в качестве ключевого аргумента? У тебя есть набор айпишников и тебе для каждого надо вычислить клиента или как?
Leningrad
Дата: 24.08.2004 20:25:17
SELECT * FROM test WHERE IP='1.1.1.1' OR IP='2.2.2.2' OR IP='3.3.3.3'
угадал?
ну народ пошел...
NECTIS
Дата: 25.08.2004 17:53:46
Leningrad.
Ну тут совсем не правда про народ...
Я наверное не так описал всё...

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

В другой таблице ведутся учетные записи где эти IP указываются.

Мне нужно сделать выборку по этим учетным записям. и вытащить все записи по клиенту. Если один IP адрес - все просто, а если их несколько?

Как мне сделать запрос (одной строчкой) чтобы выбрать эти IP адреса в одной строке а не один IP на строчку.

Это примерный запрос который я обрабатываю:
SELECT c.stationip, c.tariffdesc, c.stationid, c.setuptime, c.connecttime,
c.disconnecttime, c.duration, c.terminatecause, e.desc_short, e.desc_long, e.dec_code FROM voipcall c, isdn_error_codes e WHERE
c.stationip=(SELECT framedip FROM voipuser WHERE accountid=$acct LIMIT 1) AND c.terminatecause=e.error_code AND setuptime
BETWEEN '2004-01-01 00:00:00' AND '2004-01-02 23:59:59' ORDER BY setuptime DESC

Я выделил проблемную строчку - если IP могу записать одной строкой - то выборка пройдёт правильно - сразу по всем IP адресам клиента, а пока поставил LIMIT 1 чтобы хоть первый IP адрес вытащить. Иначе вместо одной строки будет много - почислу IP адресов...

Надеюсь так понятнее...
assa
Дата: 25.08.2004 18:12:24
смотри агрегаты.
функция сшивки строк была даже тут. (используй поиск)
centur
Дата: 25.08.2004 21:23:43
SELECT c.stationip, c.tariffdesc, c.stationid, c.setuptime, c.connecttime,
c.disconnecttime, c.duration, c.terminatecause, e.desc_short, e.desc_long, e.dec_code FROM voipcall c, isdn_error_codes e WHERE
c.stationip IN (SELECT framedip FROM voipuser WHERE accountid=$acct LIMIT 1) AND c.terminatecause=e.error_code AND setuptime
BETWEEN '2004-01-01 00:00:00' AND '2004-01-02 23:59:59' ORDER BY setuptime DESC

а вот так не подойдет (выделено жирно) ? если я правильно понял тебе нужно выбрать все данные по клиенту за период для всех его ИП ...

если работает недостаточно быстро - копай exists - хотя по заявлениям PG-team в версиях 7.4 IN работает уже не хуже exists (раньше было все плохо с in - раза в 4-5 медленней)
NECTIS
Дата: 26.08.2004 03:20:30
"ВСЁ ГЕНИАЛЬНОЕ ПРОСТО!!!"

Сделал намного проще и без лишней головной боли! Сейчас... "Копал в саду а нужно было в огороде!"

Сделал без дополнительного поиска:

SELECT c.stationip, c.tariffdesc, c.stationid, c.setuptime, c.connecttime,
c.disconnecttime, c.duration, c.terminatecause, e.desc_short, e.desc_long, e.dec_code FROM voipcall c, isdn_error_codes e, voipuser vu WHERE
c.stationip=vu.framedip AND vu.accountid=$acct AND c.terminatecause=e.error_code AND setuptime BETWEEN '2004-01-01 00:00:00' AND '2004-01-02 23:59:59' ORDER BY setuptime DESC.

Всем большое спасибо!!!
assa
Дата: 26.08.2004 10:41:19
тьфу.
тебе выбирать нескоко строк по связи?
- тады учи джойны, и не пудри мозг.

а я думал, надо выдать все ip в одной строке - вот там потребуются агрегаты.