powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / древовидные структуры
15 сообщений из 15, страница 1 из 1
древовидные структуры
    #33245644
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Пусть имеется таблица elements
{ elementID, - идентификатор элемента
parentID - идентификатор родительского элемента
}

Нужно преобразовать эту таблицу в XML-дерево. Естественно, рекуррентной вложенности в таблице никакой нет, корневые элементы имеют parentID = NULL;

Мне ничего не приходит в голову кроме тучи последовательных запросов: сначала получаем корневые элементы, потом для них, соответственно, потомков, потом потомков для потомков и т.д. Может кто-нибудть предложит идею? Возможно видоизменение таблицы.
...
Рейтинг: 0 / 0
древовидные структуры
    #33245652
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Степень вложенности логически не ограничена?
Скажем, категория, подкатегория и элемент.
...
Рейтинг: 0 / 0
древовидные структуры
    #33245674
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о степени вложенности ничего не известно, скорее всего до глубины примерно в 10 элементов
...
Рейтинг: 0 / 0
древовидные структуры
    #33245839
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не вижу проблемы в перегон таблицы древовидной в XML, в XML поддерживаются нормально вложенности элементов, главное, чтобы сначала шли родительские, а потом чилдовые.
Каких-то утилит не видел для такого, но написать в любой среде программной подобный алгорит не составляет особого труда.

Чилды имеют ключи большие чем у родителей в этой реальной таблице?
...
Рейтинг: 0 / 0
древовидные структуры
    #33245907
anonimous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если используешь MySQL 5.0 решением может быть написание рекурсивной хранимой процедуры.
...
Рейтинг: 0 / 0
древовидные структуры
    #33245914
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валентин КНе вижу проблемы в перегон таблицы древовидной в XML, в XML поддерживаются нормально вложенности элементов, главное, чтобы сначала шли родительские, а потом чилдовые.
Каких-то утилит не видел для такого, но написать в любой среде программной подобный алгорит не составляет особого труда.
Чилды имеют ключи большие чем у родителей в этой реальной таблице?

Не о труде речь :) Первое, что приходит в голову работает исправно, но медленно и неэффективно по использованию оперативы.
О ключах - всё так и есть, они автоматические.
...
Рейтинг: 0 / 0
древовидные структуры
    #33245917
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсли используешь MySQL 5.0 решением может быть написание рекурсивной хранимой процедуры.
Мысль интересная! Спасибо.
...
Рейтинг: 0 / 0
древовидные структуры
    #33245978
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selinoth авторЕсли используешь MySQL 5.0 решением может быть написание рекурсивной хранимой процедуры.
Мысль интересная! Спасибо.

Рекурсивность отключена в процедурах версии с 5.0.8, если не ошибаюсь, но отключена 100%
...
Рейтинг: 0 / 0
древовидные структуры
    #33246499
Astron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Валентин К
Рекурсивность отключена в процедурах версии с 5.0.8, если не ошибаюсь, но отключена 100%

... а поначалу в ф-ях не поддерживался SELECT. Итого найти неглючную версию с поддержкой рекурсий и DML в функциях - проблема. Вопрос обсуждался неделю назад, все красиво если задать уровень вложенности.
...
Рейтинг: 0 / 0
древовидные структуры
    #33247281
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Astron... а поначалу в ф-ях не поддерживался SELECT. Итого найти неглючную версию с поддержкой рекурсий и DML в функциях - проблема. Вопрос обсуждался неделю назад, все красиво если задать уровень вложенности.
Подскажите, плиз, где конкретно - как тема называлась?
...
Рейтинг: 0 / 0
древовидные структуры
    #33247323
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
древовидные структуры
    #33250453
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел удовлетворительное решение с помощью XSLT-преобразователя. Код на PHP получился просто малюсенький, но по таймингу работает почти в 10 раз быстрее, каскад обращений к mySQL-серверу. Очень рекомендую такой подход. Если кому интересно - могу поделиться примером.
...
Рейтинг: 0 / 0
древовидные структуры
    #33250464
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если код действительно небольшой -- мб, стоит разместить его прямо тут?
Код на PHP, конечно, имеет только косвенное отношение к MySQL, но как иллюстрация алгоритма...
...
Рейтинг: 0 / 0
древовидные структуры
    #33250471
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шаг 1: делаем выборку всех элементов таблицы вообще.

шаг 2: строим следующее XML-дерево:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<?xml version="1.0" encoding="windows-1251"?>
<tree>
<item><id>0</id><pr>0</pr> ... </item> <!-- корневой элемент -->
<item><id>1</id><pr>0</pr> ... </item>
<item><id>2</id><pr>0</pr> ... </item>
<item><id>3</id><pr>2</pr> ... </item>
....
</tree>
здесь id - идентификатор элемента, pr - идентификатор родителя. Остальных тегов может быть сколько угодно.

шаг 3: пишем XSLT-преобразование:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="windows-1251" indent="no"/>
  <xsl:template match="item">
    <xsl:variable name="id" select="id/."/>
    <item>
      <xsl:copy-of select="*[local-name()!='item']"/>
      <xsl:apply-templates select="/tree/item[pr/.=$id]"/>
    </item>
  </xsl:template>
  <xsl:template match="tree">
    <tree><xsl:apply-templates select="item[id/.='0']"/></tree>
  </xsl:template>
</xsl:stylesheet>

шаг 4: пишем PHP код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 $stylesheet = new DOMDocument();
 $stylesheet->loadXML( текст преобразователя - строка );
 $xslt_proc = new XSLTProcessor();
 $xslt_proc->importStyleSheet($stylesheet);
 $doc1 = new DOMDocument();
 $doc1->loadXML( исходное XML-дерево, строка );
 $doc2 = $xslt_proc->transformToDoc($doc1);
 echo $doc2->saveXML( ); // и мы получаем искомое!

работает шоколадно, микросекудны для весьма внушительных таблиц
...
Рейтинг: 0 / 0
древовидные структуры
    #33250554
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опечатка:
selinothНашел удовлетворительное решение с помощью XSLT-преобразователя. Код на PHP получился просто малюсенький, но по таймингу работает почти в 10 раз быстрее, чем каскад обращений к mySQL-серверу. Очень рекомендую такой подход. Если кому интересно - могу поделиться примером.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / древовидные структуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]