Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 нужен хитрый запрос....  [new]
wild_man
Member

Откуда:
Сообщений: 63
Всем привет!
столкнулся с проблеммой поиска негодяев, по логу...
общяя задача состоит в следующем:
таблица:
UID|CookieID
Пример данных:
1|2
3|2
3|4
5|4
5|6
7|6
7|8
1|8
9|10

Нужно найти всю цепочку пользователей негодяев...

на вход даётся одно из чисел, причём неизвестно что это UID или CookieID
например для числа 8 цепочка будет:
1 2 3 4 5 6 7 8

для числа 9 цепочка:
9 10

В голову приходит только рекурсия, может можно как-то проще, но как не соображу.
17 окт 06, 16:41    [3272115]     Ответить | Цитировать Сообщить модератору
 Re: нужен хитрый запрос....  [new]
sqlru-sqlru
Member [заблокирован]

Откуда:
Сообщений: 1224
wild_man
Всем привет!
столкнулся с проблеммой поиска негодяев, по логу...
общяя задача состоит в следующем:
таблица:
UID|CookieID
Пример данных:
1|2
3|2
3|4
5|4
5|6
7|6
7|8
1|8
9|10

Нужно найти всю цепочку пользователей негодяев...

на вход даётся одно из чисел, причём неизвестно что это UID или CookieID
например для числа 8 цепочка будет:
1 2 3 4 5 6 7 8

для числа 9 цепочка:
9 10

В голову приходит только рекурсия, может можно как-то проще, но как не соображу.


А как взаимосвязаны UID и CookieID юзеров негодяев? Т.е. неясно что ты хочешь получить на выходе ... "негодяй"


17 окт 06, 16:46    [3272181]     Ответить | Цитировать Сообщить модератору
 Re: нужен хитрый запрос....  [new]
wild_man
Member

Откуда:
Сообщений: 63
вообще то в данном примере негодяй это пользователи c UID=1-8
т.е явной связи нет но:
видно что:
пользователи 1,3 использовали 1 куку с cookieID=2
соотв смотрим на пользователя с UID=3 и видим:
что он получал 2 куки (cookieID=2,4) и так далее....

а вообще прежде чем смеяться, может стоит вникнуть а ?
17 окт 06, 16:55    [3272266]     Ответить | Цитировать Сообщить модератору
 Re: нужен хитрый запрос....  [new]
4aynik
Guest
2 Автор
Честно говоря не понял постановки задачи... Как Вы определяете "негодяев"???
17 окт 06, 16:59    [3272315]     Ответить | Цитировать Сообщить модератору
 Re: нужен хитрый запрос....  [new]
wild_man
Member

Откуда:
Сообщений: 63
как обычно....
пользователи использующие 2-е, 3-е, 5-рные регистрации
17 окт 06, 17:00    [3272323]     Ответить | Цитировать Сообщить модератору
 Re: нужен хитрый запрос....  [new]
mnick
Member

Откуда: Москва
Сообщений: 396
wild_man
как обычно....
пользователи использующие 2-е, 3-е, 5-рные регистрации

Так может тебе HAVING поможет?
SELECT UID FROM NEGODYAI GROUP BY UID HAVING COUNT(*) > 1
17 окт 06, 17:04    [3272362]     Ответить | Цитировать Сообщить модератору
 Re: нужен хитрый запрос....  [new]
wild_man
Member

Откуда:
Сообщений: 63
нет, не поможет....
потому как дальше нужно смотреть всез пользователей, на предмет ипользования других UID что и есть рекурсия, от которой я и хочу отказаться...
17 окт 06, 17:08    [3272410]     Ответить | Цитировать Сообщить модератору
 Re: нужен хитрый запрос....  [new]
miksoft
Member

Откуда:
Сообщений: 38539
mnick
Так может тебе HAVING поможет?
скорее уж, поможет CONNECT BY
вот только автор темы не озвучил версию Оракла, а там, насколько я помню, есть различия...
17 окт 06, 17:10    [3272441]     Ответить | Цитировать Сообщить модератору
 Re: нужен хитрый запрос....  [new]
wild_man
Member

Откуда:
Сообщений: 63
версия оракла 10.
connect by что на что ?
тоже думал на эту тему, но осложняется именно тем, колонки ID СID меняются...
попробую зарисовать наглядно:
символы "-> <-" и "|" будут обозначать связи
* исходное число

нарисуем связи:

*1->2
       |
  3<-2
  |
  3->4
       |
  5<-4
  |
  5->6
      |
  7<-6
  |
  7->8
       |
  1<-8
  9  10
17 окт 06, 17:17    [3272502]     Ответить | Цитировать Сообщить модератору
 Re: нужен хитрый запрос....  [new]
wild_man
Member

Откуда:
Сообщений: 63
разъехалость малость :(
смысл в том, что по данной цепочке видно что UID=1 8
связаны либо использованием 1-й куки либо в 1-й куке 2 пользователя, но напрямую связь между пользователями 1 и 8 не прослеживается :(
как правило это и есть 1 пользователь многократно зарегистрировшийся...
17 окт 06, 17:21    [3272530]     Ответить | Цитировать Сообщить модератору
 Re: нужен хитрый запрос....  [new]
miksoft
Member

Откуда:
Сообщений: 38539
что-то типа
SELECT * FROM table1 CONNECT BY PRIOR UID = CookieID OR PRIOR CookieID = UID
START WITH и NOCYCLE добавить по вкусу.
17 окт 06, 17:31    [3272616]     Ответить | Цитировать Сообщить модератору
 Re: нужен хитрый запрос....  [new]
wild_man
Member

Откуда:
Сообщений: 63
точнее не так....
по именно таким данным связь напрямую есть:
1|2
1|8
и как раз только эту связь и выявит запрос с группировкой по UID
но вот связи c 7-м данный запрос не выявит :(
17 окт 06, 17:32    [3272624]     Ответить | Цитировать Сообщить модератору
 Re: нужен хитрый запрос....  [new]
miksoft
Member

Откуда:
Сообщений: 38539
wild_man
но вот связи c 7-м данный запрос не выявит :(
почему? вроде через 8 должен?
17 окт 06, 17:36    [3272669]     Ответить | Цитировать Сообщить модератору
 Re: нужен хитрый запрос....  [new]
wild_man
Member

Откуда:
Сообщений: 63
2 miksoft
SELECT * FROM table1 CONNECT BY nocycle PRIOR UID = CID OR PRIOR CID = UID start with UID=1
возвращает только:
1 2
UID=3
3 2
3 4
т.е далее не идёт :(
17 окт 06, 17:39    [3272701]     Ответить | Цитировать Сообщить модератору
 Re: нужен хитрый запрос....  [new]
wild_man
Member

Откуда:
Сообщений: 63
Почитал кое чего....
оказывается это задача для нахождения графа по произвольной точке...
в DB2 говорят такое есть...
а в оракле кто нить слышал что либо подобное ?
19 окт 06, 11:30    [3281099]     Ответить | Цитировать Сообщить модератору
 Re: нужен хитрый запрос....  [new]
miksoft
Member

Откуда:
Сообщений: 38539
а так?
SELECT *
  FROM table1
 START WITH (myuid = 1 AND cookieid = 2)
CONNECT BY nocycle (PRIOR cookieid = cookieid
               AND PRIOR myuid <> myuid)
        OR (PRIOR myuid = myuid AND PRIOR cookieid <> cookieid)
правда, некторые записи в результате повторяются, это можно убрать distinct-ом.
Поля переименовал, т.к. UID - зарезервированное слово
23 окт 06, 11:30    [3294401]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить