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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Рекурсивный запос

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
White
Отправлено: 30 Октября, 2011 - 17:17:35
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




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

используется для образования древовидной структуры, здесь parent_id указывает на определённого родителя в этой же таблице, в случае если у записи parent_id = null, она не имеет родителя.
имеем id ветки. необходимо найти все записи относящиеся к ней, независимо от уровня вложенности. читал о иерархических запросах (WITH), но адекватных манов с нормальными примерами не встречал.
П.С. эта таблица из довольно крупного и известного веб приложения, менять в ней что-то не представляется возможным


-----
if(time()>1356048000) die();
 
 Top
Champion Супермодератор
Отправлено: 30 Октября, 2011 - 17:30:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




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 вот
 
 Top
White
Отправлено: 30 Октября, 2011 - 17:55:55
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




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

П.С. ман действительно адекватный, еще раз спасибо.


-----
if(time()>1356048000) die();
 
 Top
DeepVarvar Супермодератор
Отправлено: 30 Октября, 2011 - 18:46:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Champion, ащ мускуль аглы так же или только PG?
 
 Top
Champion Супермодератор
Отправлено: 30 Октября, 2011 - 19:08:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Нет, в mysql нет такого. И всяких других вкусностей нет.
А есть это не только в PG. Везде есть, кроме мускуля: и в MS, и в firebird, и в oracle...
 
 Top
White
Отправлено: 30 Октября, 2011 - 19:20:25
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




Champion а что ж мускуль так обидели?


-----
if(time()>1356048000) die();
 
 Top
Champion Супермодератор
Отправлено: 30 Октября, 2011 - 19:24:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Кто ж его знает. Я его не разрабатывал)
 
 Top
DeepVarvar Супермодератор
Отправлено: 30 Октября, 2011 - 19:24:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Печалька...
 
 Top
Мелкий Супермодератор
Отправлено: 30 Октября, 2011 - 19:48:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




White пишет:
а что ж мускуль так обидели?

а мускул по своей архитектуре - вообще удивителен.
Например, есть совершенно уникальный квери кэш - кэширующий не план запроса, как другие, а результаты.
Куча несвязанных типов хранилищ, сделанных вовсе модулями, общающиеся через API. Из которых умеет транзакции и при этом работает - только 1 - innoDB.
Все вопросы кластеризации/high-available решаются репликации, с которой - головная боль и без которой - головная боль.


-----
PostgreSQL DBA
 
 Top
White
Отправлено: 30 Октября, 2011 - 22:14:55
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




Мелкий интересно почему тогда он остается настолько популярным?


-----
if(time()>1356048000) die();
 
 Top
DeepVarvar Супермодератор
Отправлено: 30 Октября, 2011 - 22:19:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




White пишет:
почему тогда он остается настолько популярным?
Халявный?
 
 Top
Мелкий Супермодератор
Отправлено: 31 Октября, 2011 - 07:47:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




White, из-за своей простоты и низкого порога вхождения. Как и PHP, в общем.

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

ну и не без этого, конечно Подмигивание


-----
PostgreSQL DBA
 
 Top
Champion Супермодератор
Отправлено: 31 Октября, 2011 - 08:36:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Ну постгре и файрберд вроде бы не менее халявные.
Просто большинству людей СУБД нужна на уровне простеньких селектов. С этим mysql справляется. А как только надо сделать что-то более или менее сложое, то ту его не хватает. Даже не только рекурсивные запросы или оконные функции. Выборки, которые ничего необычного не используют, которые просто включают много условий, сортировок и объединений, mysql-м часто весьма неудачно оптимизируются тоже
 
 Top
White
Отправлено: 31 Октября, 2011 - 18:41:38
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




Champion пишет:
СУБД нужна на уровне простеньких селектов
для этого вполне достаточно sqlite. тем более что на простых выборках он по скорости у mysql выиграет.


-----
if(time()>1356048000) die();
 
 Top
Мелкий Супермодератор
Отправлено: 31 Октября, 2011 - 19:52:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Champion пишет:
Ну постгре и файрберд вроде бы не менее халявные.

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


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB