Nested Set
Jerzy Skalski - 15-03-2007 00:04
Nested Set
Witam,
od kilku godzin zmagam się z zadaniem, który nie ptrafię rozwiązać. Problem: zaimplementować drzewo kategorii za pomocą "nested set". Chcę aby kategorie można było wyświetlić w postaci eleganckiego drzewka HTML. W tym celu z tabeli MySQL muszę wyciągnąć następujące dane: name, children, level, next_brother gdzie name - nazwa węzła children - liczba węzłów potomnych level - poziom zagnieżdzenia next_brother - czy dany wezeł ma jeszcze brata po swojej prawej stronie
Tabela ma następującą postać:
CREATE TABLE categories ( id int not null primary key, name varchar(100), l int, r int );
Tabela jest oczywiście wypełniona danymi. Query, które wyciągnie mi interesujące dane ma następującą postać:
SELECT s.name, round((s.r -s.l - 1)/2, 0) AS children, count(*) AS level FROM categories v, categories s WHERE s.l BETWEEN v.l AND v.r GROUP BY s.l;
Do kompletu potrzebuję jeszcze informacji o tym, czy dany węzęł ma następnika(?) na tym samym poziomie - next_brother. Informacji może być w postaci 1 (tak ma następne rodzeństwo) lub 0 (nie ma następnego brata). Powyższe zapytanie muszę tak uzupełnić aby w next_brother pojawiła się taka informacja (1 lub 0).
Pozdrowienia Jerzy Skalski
Jerzy Skalski - 16-03-2007 00:02
Jerzy Skalski wrote: > Witam, > > od kilku godzin zmagam się z zadaniem, który nie ptrafię rozwiązać. > Problem: > zaimplementować drzewo kategorii za pomocą "nested set". Chcę aby > kategorie można było wyświetlić w postaci eleganckiego drzewka HTML. > W tym celu z tabeli MySQL muszę wyciągnąć następujące dane: > name, children, level, next_brother gdzie > name - nazwa węzła > children - liczba węzłów potomnych > level - poziom zagnieżdzenia > next_brother - czy dany wezeł ma jeszcze brata po swojej prawej stronie > > Tabela ma następującą postać: > > CREATE TABLE categories ( > id int not null primary key, > name varchar(100), > l int, > r int > ); > > Tabela jest oczywiście wypełniona danymi. Query, które wyciągnie mi > interesujące dane ma następującą postać: > > SELECT s.name, round((s.r -s.l - 1)/2, 0) AS children, count(*) AS level > FROM categories v, categories s > WHERE s.l BETWEEN v.l AND v.r > GROUP BY s.l; > > Do kompletu potrzebuję jeszcze informacji o tym, czy dany węzęł ma > następnika(?) na tym samym poziomie - next_brother. Informacji może być > w postaci 1 (tak ma następne rodzeństwo) lub 0 (nie ma następnego > brata). Powyższe zapytanie muszę tak uzupełnić aby w next_brother > pojawiła się taka informacja (1 lub 0). > Witam,
dzisiaj znalazłem rozwiązanie tego problemu, które opiera się na spostrzeżeniu, że w węzłach, nie posiadających następnego brata, r ma zawsze wartość mniejszą o 1 od wartości r ich rodzica. Co prawda ta część zapytania, która generuje mi info o następnym bracie, jest toporna ale najważniejsze, że to działa:
SELECT s.name, COUNT(*) AS level, ROUND((s.r-s.l-1)/2, 0) AS children, NOT SUM((v.r-s.l=1)+(s.l=1)) AS brother FROM cat v, cat s WHERE s.l BETWEEN v.l AND v.r GROUP BY s.l;
Pozdrowienia Jerzy Skalski
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[MS SQL] "set names" (mySQL) w MS SQL
db2 alter table alter column set default
[DB2/Websphere]: JDBC - result set closed
MySQL czy da sie zmienic CHARACTER SET bazy danych?
UPDATE tabname SET * = ? - Oracle vs Informix
(mysql) zmian character_set_system
set timing on, autotrace przez jdbc
Mysql 4.0.24 a CHARACTER SET
[ORACLE] zmiana character set
[mysql] uzyskanie listy z set
zanotowane.pldoc.pisz.plpdf.pisz.plponland.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|