|
Задача на рекурсивный запрос
|
|||
---|---|---|---|
#18+
Здравствуйте, скажу честно, сам опытный программист, но вот с этой задачей зашел в тупик, поэтому, решил ее разместить здесь. Есть таблица организующая дерево (ID, ID_PARENT, NAME) Нужно организовать фильтр по полю (NAME like :searsh_str), при том, в выборку должны попасть не только отфильтрованные записи, но и все их родители. К примеру, исходные данные: ID ID_PARENT NAME 1 null фрукт 2 null овощ 3 1 яблоко 4 2 морковь нужно выбрать name like '%бло%' и получить результат: ID ID_PARENT NAME 1 null фрукт 3 1 яблоко уровней родственников может быть несколько, соответственно "select in select" не предлагать.. пробовал with recursive .., но как это обернуть, мне не догадаться.. Один вариант я придумал (добавить в таблицу поле level и отслеживать его), но он мне не нравится, кто-нибудь предложит какой-либо вариант решения данной задачи? FireBird, Dialect 3 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2015, 19:23 |
|
Задача на рекурсивный запрос
|
|||
---|---|---|---|
#18+
Asinkritпробовал with recursive .., но как это обернуть, мне не догадаться.. В последнем посте прикреплённой темы есть ссылка. Читал? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2015, 19:35 |
|
Задача на рекурсивный запрос
|
|||
---|---|---|---|
#18+
Asinkrit, просто переверни рекурсию задом наперёд. типа такого Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
получаем Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2015, 19:58 |
|
Задача на рекурсивный запрос
|
|||
---|---|---|---|
#18+
Симонов Денис, спасибо, работает, однако не все гладко, если я передаю пустое значение для фильтра, то дерево строится с дублирующими записями, с одной стороны в самом запросе можно заюзать distinct, но остается понимание, что при увеличении таблицы, возрастет нагрузка на сервер (это очень не желательно), можно это как нибудь обойти? На крайний случай, я конечно разделю логику, и буду юзать 2 разных запроса, с фильтром и без.. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2015, 17:24 |
|
Задача на рекурсивный запрос
|
|||
---|---|---|---|
#18+
Asinkritесли я передаю пустое значение для фильтра, то дерево строится с дублирующими записями На самом деле у тебя всегда могу быть дубли, если не производить фильтрацию только по листовым элементам (не содержащим потомков). Как эффективно решить задачу на сервере без distinct, я лично не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2015, 18:04 |
|
|
start [/forum/topic.php?fid=40&msg=39010790&tid=1562715]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
others: | 27ms |
total: | 150ms |
0 / 0 |