Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Рекурсивный запос
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Рекурсивный запос

Страниц (1): [1]
 

1. White - 30 Октября, 2011 - 17:17:35 - перейти к сообщению
Имеется таблица на postgre, следующей структуры
CODE (htmlphp):
скопировать код в буфер обмена
  1. +++++++++++++++++++
  2. +id+parent_id+name+
  3. +++++++++++++++++++

используется для образования древовидной структуры, здесь parent_id указывает на определённого родителя в этой же таблице, в случае если у записи parent_id = null, она не имеет родителя.
имеем id ветки. необходимо найти все записи относящиеся к ней, независимо от уровня вложенности. читал о иерархических запросах (WITH), но адекватных манов с нормальными примерами не встречал.
П.С. эта таблица из довольно крупного и известного веб приложения, менять в ней что-то не представляется возможным
2. Champion - 30 Октября, 2011 - 17:30:31 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. WITH tree AS (
  2.         SELECT id, parent_id, name
  3.         FROM tbl
  4.         WHERE id = 111 -- начинаем от вершины с айдишкой 111
  5.         UNION ALL -- внизу рекурсивная часть
  6.         SELECT tbl.id, tbl.parent_id, tree.id
  7.         FROM tbl -- получаем строку из нашей таблицы ...
  8.         JOIN tree ON tbl.parent_id = tree.id -- ... в которой parent_id равен id уже выбранной строки
  9. -- в конечном итоге найдется строка, которая не будет ни для кого родительской и произойдет выход из рекурсии
  10. )
  11. SELECT * FROM tree

Ща найду адекватный ман
(Добавление)
http://www[dot]sql-tutorial[dot]ru/ru/bo[dot][dot][dot]cursive_cte[dot]html вот
3. White - 30 Октября, 2011 - 17:55:55 - перейти к сообщению
Champion Спасибо, лови карму.
В контексте postgre получилось так:
CODE (SQL):
скопировать код в буфер обмена
  1. WITH RECURSIVE tree AS (
  2.             SELECT id, parent_id, name
  3.             FROM projects
  4.             WHERE id = 1
  5.             UNION ALL
  6.             SELECT projects.id, projects.parent_id, projects.name
  7.             FROM projects
  8.             JOIN tree ON projects.parent_id = tree.id
  9. )
  10. SELECT * FROM tree

П.С. ман действительно адекватный, еще раз спасибо.
4. DeepVarvar - 30 Октября, 2011 - 18:46:30 - перейти к сообщению
Champion, ащ мускуль аглы так же или только PG?
5. Champion - 30 Октября, 2011 - 19:08:06 - перейти к сообщению
Нет, в mysql нет такого. И всяких других вкусностей нет.
А есть это не только в PG. Везде есть, кроме мускуля: и в MS, и в firebird, и в oracle...
6. White - 30 Октября, 2011 - 19:20:25 - перейти к сообщению
Champion а что ж мускуль так обидели?
7. Champion - 30 Октября, 2011 - 19:24:00 - перейти к сообщению
Кто ж его знает. Я его не разрабатывал)
8. DeepVarvar - 30 Октября, 2011 - 19:24:36 - перейти к сообщению
Печалька...
9. Мелкий - 30 Октября, 2011 - 19:48:20 - перейти к сообщению
White пишет:
а что ж мускуль так обидели?

а мускул по своей архитектуре - вообще удивителен.
Например, есть совершенно уникальный квери кэш - кэширующий не план запроса, как другие, а результаты.
Куча несвязанных типов хранилищ, сделанных вовсе модулями, общающиеся через API. Из которых умеет транзакции и при этом работает - только 1 - innoDB.
Все вопросы кластеризации/high-available решаются репликации, с которой - головная боль и без которой - головная боль.
10. White - 30 Октября, 2011 - 22:14:55 - перейти к сообщению
Мелкий интересно почему тогда он остается настолько популярным?
11. DeepVarvar - 30 Октября, 2011 - 22:19:18 - перейти к сообщению
White пишет:
почему тогда он остается настолько популярным?
Халявный?
12. Мелкий - 31 Октября, 2011 - 07:47:47 - перейти к сообщению
White, из-за своей простоты и низкого порога вхождения. Как и PHP, в общем.

DeepVarvar пишет:
Халявный?

ну и не без этого, конечно Подмигивание
13. Champion - 31 Октября, 2011 - 08:36:34 - перейти к сообщению
Ну постгре и файрберд вроде бы не менее халявные.
Просто большинству людей СУБД нужна на уровне простеньких селектов. С этим mysql справляется. А как только надо сделать что-то более или менее сложое, то ту его не хватает. Даже не только рекурсивные запросы или оконные функции. Выборки, которые ничего необычного не используют, которые просто включают много условий, сортировок и объединений, mysql-м часто весьма неудачно оптимизируются тоже
14. White - 31 Октября, 2011 - 18:41:38 - перейти к сообщению
Champion пишет:
СУБД нужна на уровне простеньких селектов
для этого вполне достаточно sqlite. тем более что на простых выборках он по скорости у mysql выиграет.
15. Мелкий - 31 Октября, 2011 - 19:52:42 - перейти к сообщению
Champion пишет:
Ну постгре и файрберд вроде бы не менее халявные.

Ну если на то пошло, то и у оракла и у db2 есть бесплатный лицензии. И их производительности хватит на весьма неслабый проект.

 

Powered by ExBB FM 1.0 RC1