Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка в виде "дерева" (иерархия) 
V
    Опции темы
nitr
Дата 17.8.2006, 04:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: нет
Всего: 84



Здравствуйте!
Вот пример маленькой БД
Код

DROP TABLE IF EXISTS test;
CREATE TABLE test (`id` BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY, `pid` BIGINT NOT NULL, `title` TEXT NOT NULL);
INSERT INTO test VALUES(NULL, 0, 'cat1');
INSERT INTO test VALUES(NULL, 0, 'cat2');
INSERT INTO test VALUES(NULL, 1, 'cat3');
INSERT INTO test VALUES(NULL, 1, 'cat4');
INSERT INTO test VALUES(NULL, 2, 'cat5');
INSERT INTO test VALUES(NULL, 2, 'cat6');
INSERT INTO test VALUES(NULL, 1, 'cat7');
INSERT INTO test VALUES(NULL, 5, 'cat8');
INSERT INTO test VALUES(NULL, 13, 'cat9');
INSERT INTO test VALUES(NULL, 1, 'cat10');
INSERT INTO test VALUES(NULL, 0, 'cat11');
INSERT INTO test VALUES(NULL, 3, 'cat12');
INSERT INTO test VALUES(NULL, 21, 'cat13');
INSERT INTO test VALUES(NULL, 7, 'cat14');
INSERT INTO test VALUES(NULL, 2, 'cat15');
INSERT INTO test VALUES(NULL, 3, 'cat16');
INSERT INTO test VALUES(NULL, 1, 'cat17');
INSERT INTO test VALUES(NULL, 21, 'cat18');
INSERT INTO test VALUES(NULL, 2, 'cat19');
INSERT INTO test VALUES(NULL, 1, 'cat20');
INSERT INTO test VALUES(NULL, 0, 'cat21');


Кто может помочь, или подскажите в сторону чего смотреть, чтоб получить результат выборки в виде дерева (иерархии), т.е. 
Код

Родитель1
  Дочь1_1
    ---
  Дочь2_1
    ---
Родитель2
  Дочь1_2
    ---
  Дочь2_2
    ---

Буду очень благодарен за любую помощь. Сам не смог... замучился smile


--------------------
PM   Вверх
jsa
Дата 17.8.2006, 05:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

Репутация: 1
Всего: 20



все зависит от сервера БД, в оракле, например, есть поддержка вложеных запросов в SQL, через start with ... connect by prior, там можно это сделать, как в остальных, не знаю, в Firebird такого точно нет
имхо только pl/sql, но тогда это уже не резалтсет


--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
chief39
Дата 17.8.2006, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 8
Всего: 77



Только хранимой процедурой
В оракле - connect by или неименованный блок плскл.
В T-SQL - процедурой

Если СУБД не поддерживает процедуры - тогда устроить рекурсию вне СУБД, на уровне приложения.


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
nitr
Дата 17.8.2006, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: нет
Всего: 84



Извиняюсь, СУБД  - MySQL.
Я вот и хотел только на уровне БД сделать... чтоб нагрузку на него возложить. В моём случае должно быстрей работать, чем приложение. Хоть и на перл всё можно, но хотел выборку в БД.
Спасибо, сейчас буду смотреть дальше...


--------------------
PM   Вверх
Akina
Дата 17.8.2006, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Цитата(nitr @  17.8.2006,  14:01 Найти цитируемый пост)
СУБД  - MySQL

Версии ...?

Цитата(nitr @  17.8.2006,  05:29 Найти цитируемый пост)
Кто может помочь, или подскажите 

А ты вместо навылет непонятной таблицы лучше поясни, как именно определяется кто кому родитель и/или потомок... Где связность? Одно- или двунаправленная, вверх или вниз?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
LSD
Дата 17.8.2006, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 24
Всего: 538



Цитата(Akina @  17.8.2006,  15:25 Найти цитируемый пост)
А ты вместо навылет непонятной таблицы лучше поясни, как именно определяется кто кому родитель и/или потомок... Где связность?

Поле pid - id родительского узла.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
chief39
Дата 17.8.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 8
Всего: 77



Цитата(nitr @  17.8.2006,  13:01 Найти цитируемый пост)
Извиняюсь, СУБД  - MySQL.
Я вот и хотел только на уровне БД сделать... чтоб нагрузку на него возложить. В моём случае должно быстрей работать, чем приложение. Хоть и на перл всё можно, но хотел выборку в БД.

Говорят, с пятой версии майскл поддерживает процедуры.
Попробуй на сервер БД перенести эти вычисления


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
LSD
Дата 17.8.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 24
Всего: 538



Цитата(chief39 @  17.8.2006,  18:06 Найти цитируемый пост)
Говорят, с пятой версии майскл поддерживает процедуры.

А как здесь поможет процедура?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Akina
Дата 18.8.2006, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Цитата(LSD @  17.8.2006,  16:50 Найти цитируемый пост)
Поле pid - id родительского узла.

Смотрю как именно заполняется данными таблица и - не верю. 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
nitr
Дата 18.8.2006, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: нет
Всего: 84



Akina, я дал пример. Он верен, абсолютно. Просто такой вид может приобрести при удалении какой-то строки... id не обязательно по порядку (в моё примере я сразу сделал такого вида таблицу). Я для упрощения представления дал...
MySQL 4.1 процедуры не поддерживает.
Вопрос был в том, что можно ли средствами "мускула" сделать такую выборку. Лучше манипулировать данными "мускулом", т.е. быстрей...
Спасибо и на этом ;)

З.Ы.: Простой пример таблицы на словах
Монитор -           id 1 pid 0
TFT -                    id 2 pid 1
CRT -                   id 3 pid 1
Samsung 940N - id 4 pid 2
Samsung 920N - id 5 pid 2
LG 775              - id 6 pid 3
LG 795              - id 7 pid 3

"Удалите" к примеру id 4 и внесите в таблицу другие мониторы TFT, потом мониторы CRT. Вот и получится примерно как я дал пример ;)

Это сообщение отредактировал(а) nitr - 18.8.2006, 09:56


--------------------
PM   Вверх
chief39
Дата 18.8.2006, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 8
Всего: 77



Цитата(LSD @  17.8.2006,  17:26 Найти цитируемый пост)
А как здесь поможет процедура? 

В сайбэйсе делали так:
ТМП Табличка - в ней процедура сохраняет промежуточные данные при проходе дерева
Потом делается выборка из таблички(в этой же процедуре).
Если не указать into bla-bla - резалтсет выскакивает наверх как из банального селект стейтмента.
И наверху абсолютно аналогично обрабатывается.

В мускл так может не работать.

Но можно из ТМП таблички тянуть запросом, после заполнения процедурой.


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Cashey
Дата 18.8.2006, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Цитата(nitr @  17.8.2006,  05:29 Найти цитируемый пост)
Родитель1
  Дочь1_1
    ---
  Дочь2_1
    ---
Родитель2
  Дочь1_2
    ---
  Дочь2_2
    ---

если я все правильно понял, то это вопрос по группировке. делается группировка по "родителям" и по "дочкам". хотя, вероятно я что-то не понял, ибо уж очень простым представляется решение smile


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
LSD
Дата 18.8.2006, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 24
Всего: 538



Цитата(chief39 @  18.8.2006,  10:59 Найти цитируемый пост)
ТМП Табличка

Не люблю я это дело, но как вариант действительно подойдет.
Хотя в Oracle вроде можно и курсор сгенерить в динамике.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
nitr
Дата 18.8.2006, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: нет
Всего: 84



Цитата(Cashey @  18.8.2006,  10:12 Найти цитируемый пост)
если я все правильно понял, то это вопрос по группировке. делается группировка по "родителям" и по "дочкам". хотя, вероятно я что-то не понял, ибо уж очень простым представляется решение smile 

попытайтесь продолжить свою мысль и вы поймёте, что это не получится ;)

А поповоду тмп-таблички, MySQL 4.1 не знает о хран. процедурах... На перл я могу всё это сделать, но хотел возложить всё на MySQL. Либо есть уж "решение" - при обновлении данных в табличке с помощью перл делать "временную" таблицу, из которой потом просто сделать select * ;) Но ско-ко обсуждал это, все считают данное решение - избыточные данные.


--------------------
PM   Вверх
sergejzr
Дата 18.8.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 3
Всего: 360



Добавь им порядковые номера и с каждым изменением таблицы пересчитывай их заного.



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0770 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.