Zdrav�m,pot�ebuji z datab�ze generovat menu a nenapadlo m� nic lep��ho, ne� si jej ulo�it jako hierarchickou strukturu, vy�el jsem z �l�nku:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/�... Bohu�el lep�� zp�sob jak m�t neomezen� se v�tv�c� stromy jsem zat�m nena�el, vyjma konkuren�n�ho PgSQL.
Struktura menu tabulky je:
CREATE TABLE MMENU (
� � TITLE � � � �D_VARCHAR50 /* D_VARCHAR50 = VARCHAR(50) */,� � MNAME � � � �D_VARCHAR50 /* D_VARCHAR50 = VARCHAR(50) */,� � PARENT_NAME �D_VARCHAR50 /* D_VARCHAR50 = VARCHAR(50) */,� � VISUAL � � � D_BOOLEAN /* D_BOOLEAN = SMALLINT DEFAULT 0 NOT NULL CHECK (VALUE IN (0, 1)) */,� � PROJNAME � � D_VARCHAR255 /* D_VARCHAR255 = VARCHAR(255) */,� � NAMESPACE � �D_VARCHAR255 /* D_VARCHAR255 = VARCHAR(255) */,� � CLASSNAME � �D_VARCHAR255 /* D_VARCHAR255 = VARCHAR(255) */,� � PCODES � � � D_PCODES /* D_PCODES = VARCHAR(200) */,� � VISORDER � � D_INTEGER /* D_INTEGER = INTEGER */,� � MMENU_ID � � D_ID NOT NULL /* D_ID = BIGINT NOT NULL */,� � TREE_ID � � �D_ID /* D_ID = BIGINT NOT NULL */,� � LFT � � � � �D_ID /* D_ID = BIGINT NOT NULL */,� � RGHT � � � � D_ID /* D_ID = BIGINT NOT NULL */);Strukturu m�m malinko zm�n�nou, p�id�v�m tree_id, kter� je shodn� s generovan�m ID p��slu�n�ho stromu, tj. polo�ky stoj�c� na nejvy��� �rovni. Druh�m p��davkem je visorder, kter�m si ��k�m po�ad� zobrazen� v dan� v�tvi a �rovni.Kdy� chci cel� strom, pot�ebuji v jednom m�st� dos�hnout lexikografick� �azen� (prost� ala slovn�k):SELECT DISTINCT�title,mname,(� select (� � count(parent.mname) - 1) AS ddd� FROM mmenu as parent, mmenu as node� where node.lft between parent.lft and parent.rght and node.tree_id=parent.tree_id� and node.tree_id=t1.tree_id
) as dpth,(LIST(
� select� � lpad(� � � parent.visorder,10,'0') as xx from mmenu as parent, mmenu as node WHERE node.lft between� � � parent.lft AND parent.rght and parent.mname = t1.mname ORDER BY node.mname� � )) as oPath�FROM mmenu AS t1
probl�m m�m s kombinac� funkce LIST a subselect:�
"Dynamic SQL Error.SQL error code = -104.Token unknown - line 13, column 3.select."
Ano, je to postup z MySQL, kde pou��v�m GROUP_CONCAT.
LPAD pou��vďż˝m „emulaci“ ZERO FILLED, bez doplnďż˝nďż˝ nulami funguje lexikografickďż˝ ďż˝azenďż˝ divnďż˝.
Pros�m, jestli n�kdo vid�te n�jakou zjevnou chybu.
D�kuji� MaReK Ol�avsk�--
--
Archiv a podrobnosti t�to konference:
http://groups.google.com/group/firebird_cz .
---
Tuto zpr�vu jste obdr�eli, proto�e jste p�ihl�eni k odb�ru skupiny Firebird (CZ) ve Skupin�ch Google.
Pokud chcete zru�it odb�r skupiny, aby v�m z n� ji� nechodily e-maily, za�lete e-mail na adresu firebird_cz...@googlegroups.com.
Dal�� mo�nosti najdete na adrese https://groups.google.com/groups/opt_out.
ďż˝
ďż˝
![]() |
|
| Karel Nagy | |
| IT odd�len� | |
| Tel: | + 420 465 350 913 |
| Fax: | + 420 465 350 815 |
| E-mail: | na...@soma.cz |
| Web: | www.soma-eng.com |
Do funkce list nevstupuje select, ale jeho sloupeček:
select( LIST(lpad(parent.visorder,10,'0') ....) from ... )
K
Dne 11.4.2013 13:55, marek.o...@gmail.com napsal(a):
Zdravím,
potřebuji z databáze generovat menu a nenapadlo mě nic lepšího, než si jej uložit jako hierarchickou strukturu, vyšel jsem z článku:
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ ... Bohužel lepší způsob jak mít neomezeně se větvící stromy jsem zatím nenašel, vyjma konkurenčního PgSQL.
Struktura menu tabulky je:
CREATE TABLE MMENU (
TITLE D_VARCHAR50 /* D_VARCHAR50 = VARCHAR(50) */,MNAME D_VARCHAR50 /* D_VARCHAR50 = VARCHAR(50) */,PARENT_NAME D_VARCHAR50 /* D_VARCHAR50 = VARCHAR(50) */,VISUAL D_BOOLEAN /* D_BOOLEAN = SMALLINT DEFAULT 0 NOT NULL CHECK (VALUE IN (0, 1)) */,PROJNAME D_VARCHAR255 /* D_VARCHAR255 = VARCHAR(255) */,NAMESPACE D_VARCHAR255 /* D_VARCHAR255 = VARCHAR(255) */,CLASSNAME D_VARCHAR255 /* D_VARCHAR255 = VARCHAR(255) */,PCODES D_PCODES /* D_PCODES = VARCHAR(200) */,VISORDER D_INTEGER /* D_INTEGER = INTEGER */,MMENU_ID D_ID NOT NULL /* D_ID = BIGINT NOT NULL */,TREE_ID D_ID /* D_ID = BIGINT NOT NULL */,LFT D_ID /* D_ID = BIGINT NOT NULL */,RGHT D_ID /* D_ID = BIGINT NOT NULL */);
Strukturu mám malinko změněnou, přidávám tree_id, které je shodné s generovaným ID příslušného stromu, tj. položky stojící na nejvyšší úrovni. Druhým přídavkem je visorder, kterým si říkám pořadí zobrazení v dané větvi a úrovni.Když chci celý strom, potřebuji v jednom místě dosáhnout lexikografické řazení (prostě ala slovník):
SELECT DISTINCTtitle,mname,(select (
count(parent.mname) - 1) AS ddd
FROM mmenu as parent, mmenu as node
where node.lft between parent.lft and parent.rght and node.tree_id=parent.tree_id
and node.tree_id=t1.tree_id) as dpth,(LIST(
selectlpad(
parent.visorder,10,'0') as xx from mmenu as parent, mmenu as node WHERE node.lft between
parent.lft AND parent.rght and parent.mname = t1.mname ORDER BY node.mname
)) as oPathFROM mmenu AS t1
problém mám s kombinací funkce LIST a subselect:
"Dynamic SQL Error.SQL error code = -104.Token unknown - line 13, column 3.select."
Ano, je to postup z MySQL, kde používám GROUP_CONCAT.
LPAD používám „emulaci“ ZERO FILLED, bez doplnění nulami funguje lexikografické řazení divně.
Prosím, jestli někdo vidíte nějakou zjevnou chybu.
DěkujiMaReK Olšavský
--
--
Archiv a podrobnosti této konference:
http://groups.google.com/group/firebird_cz .
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny Firebird (CZ) ve Skupinách Google.
Pokud chcete zrušit odběr skupiny, aby vám z ní již nechodily e-maily, zašlete e-mail na adresu firebird_cz...@googlegroups.com.
Další možnosti najdete na adrese https://groups.google.com/groups/opt_out.
--
Karel Nagy IT oddělení
Tel: + 420 465 350 913 Fax: + 420 465 350 815 E-mail: na...@soma.cz Web: www.soma-eng.com
--
--
Archiv a podrobnosti této konference:
http://groups.google.com/group/firebird_cz .
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny Firebird (CZ) ve Skupinách Google.
Pokud chcete zrušit odběr skupiny, aby vám z ní již nechodily e-maily, zašlete e-mail na adresu firebird_cz...@googlegroups.com.
Další možnosti najdete na adrese https://groups.google.com/groups/opt_out.