|
рекурсивно обойти таблицу, как направленный граф
|
|||
---|---|---|---|
#18+
Всем привет! У меня есть таблица Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
я бы хотел имея только ip, вернуть все строки, которые связаны между собой, написал запрос, но не понимаю как развернуть вторую часть Код: sql 1. 2. 3. 4. 5. 6.
Возвращает ошибку Код: sql 1.
Подскажите, пожалуйста, как составить правильно вторую часть, после UNION'a. В итоге при запросе ip = 10.1.1.3 должны вернуться все строки, с ip 1,2,3,4,5, а при запросе ip = 1.1.1.6 только ip c 6 и 7 Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
02.01.2017, 14:12 |
|
рекурсивно обойти таблицу, как направленный граф
|
|||
---|---|---|---|
#18+
no_username Код: sql 1. 2. 3. 4. 5. 6.
Возвращает ошибку Код: sql 1.
Подскажите, пожалуйста, как составить правильно вторую часть, после UNION'a. В итоге при запросе ip = 10.1.1.3 должны вернуться все строки, с ip 1,2,3,4,5, а при запросе ip = 1.1.1.6 только ip c 6 и 7 В выделенной строке, алиас `r` неопределён. Если хотите привязаться к самому себе в рекурсивном запросе, то нужно явно это делать во FROM-части запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.01.2017, 14:26 |
|
рекурсивно обойти таблицу, как направленный граф
|
|||
---|---|---|---|
#18+
vyegorovВ выделенной строке, алиас `r` неопределён. Если хотите привязаться к самому себе в рекурсивном запросе, то нужно явно это делать во FROM-части запроса. Я понимаю что значит ошибка, но не понимаю как переделать вторую часть. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.01.2017, 14:38 |
|
рекурсивно обойти таблицу, как направленный граф
|
|||
---|---|---|---|
#18+
no_username, Что не так в данном запросе: Код: sql 1. 2. 3.
И как испроавить? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.01.2017, 16:15 |
|
рекурсивно обойти таблицу, как направленный граф
|
|||
---|---|---|---|
#18+
vyegorovno_username, Что не так в данном запросе: Код: sql 1. 2. 3.
И как испроавить? Нет клиента, надо его заджойнить, что-то вроде Код: sql 1. 2. 3. 4.
Как я понимаю, это что-то типа подсказки... С простыми полями все просто, но вот jsonb_each все ломает, не понимаю как достать следующих соседей все равно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.01.2017, 16:29 |
|
рекурсивно обойти таблицу, как направленный граф
|
|||
---|---|---|---|
#18+
vyegorov, я уже доходил до Код: sql 1.
но так и не понял как достать значения соседей из s.ports, всю документацию облазил по функциям jsonb уже... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.01.2017, 16:38 |
|
рекурсивно обойти таблицу, как направленный граф
|
|||
---|---|---|---|
#18+
Что-то мне ТС напоминает статью из ИТ-энциклопедии. Рекурсия - см. рекурсия. и Для того, чтобы понять рекурсию, нужно сначала понять рекурсию. А по делу - вам же черным по белому написано, что если объявил with recursive blablabla, то будь добр, выбери из этого блаблабла: WITH RECURSIVE included_parts (sub_part, part, quantity) AS ( SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product' UNION ALL SELECT p.sub_part, p.part, p.quantity FROM included_parts pr , parts p WHERE p.part = pr.sub_part ) SELECT sub_part, SUM(quantity) as total_quantity FROM included_parts GROUP BY sub_part где рекурсия-то в рекурсивном запросе??? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.01.2017, 16:53 |
|
рекурсивно обойти таблицу, как направленный граф
|
|||
---|---|---|---|
#18+
Вроде как сделал, но результат довольно медленный получается Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.01.2017, 16:56 |
|
рекурсивно обойти таблицу, как направленный граф
|
|||
---|---|---|---|
#18+
еще бы. 10.1.1.6 | {"port1": {"n": "10.1.1.7"}} 10.1.1.7 | {"port2": {"n": "10.1.1.6"}} оно точно возвращается для этой бесконечной рекурсии? ))) где заглушка-то на (эмуляцию nocycle, прастихосспади, но я нынче ораклоид, рекурсивные with-ы позабыл) не, это хорошо, что оно вернется, прогруппирует, т.к. union без all, и выдаст результат... но лучше в рекурсии смотреть детект "мы тут уже были", чего я не наблюдаю. например, как тут: http://stackoverflow.com/questions/25058906/nocycle-in-postgres ... |
|||
:
Нравится:
Не нравится:
|
|||
02.01.2017, 17:11 |
|
рекурсивно обойти таблицу, как направленный граф
|
|||
---|---|---|---|
#18+
Hawkmoon, медленно это 0.25 сек https://explain.depesz.com/s/dcnT да, оно возвращается, но слишком много селектов делается, мне проще выбрать все данные и перебрать алгоритмом в коде. Я думал может быть будет быстро внутри постгреса это сделать, но нет. По nocycle идею понял, спасибо. Только там каждый раз создается новый array, и в финальный результат попадает много дублей, по скорости - так же. Надо делать какой-то глобальный массив visited, но это уже PLPQSQL надо использовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.01.2017, 18:07 |
|
рекурсивно обойти таблицу, как направленный граф
|
|||
---|---|---|---|
#18+
no_username, не массив visited, а отсечение в выборке, "были мы уже тут или нет" по уникальной идентификации узла обхода. Для вашего случая - ip - вполне себе уникальная идентификация. Дальше нужно думать и копать, сходу не получится. но на мой взгляд, на SO идет дискач вполне себе конструктивный, с отсечением "был я тут или нет" по pk_id. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.01.2017, 18:53 |
|
рекурсивно обойти таблицу, как направленный граф
|
|||
---|---|---|---|
#18+
no_usernameда, оно возвращается, но слишком много селектов делается, мне проще выбрать все данные и перебрать алгоритмом в коде. Я думал может быть будет быстро внутри постгреса это сделать, но нет.Да, вполне вероятно, что вычисление в приложении окажется на порядок быстрее рекурсивного запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 09:23 |
|
рекурсивно обойти таблицу, как направленный граф
|
|||
---|---|---|---|
#18+
Пример с проверкой зацикливания есть в документации (см. cycle). https://www.postgresql.org/docs/9.6/static/queries-with.html ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 09:27 |
|
|
start [/forum/topic.php?fid=53&fpage=80&tid=1996768]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
others: | 349ms |
total: | 465ms |
0 / 0 |