LIST se subselectem

29 views
Skip to first unread message

marek.o...@gmail.com

unread,
Apr 11, 2013, 7:55:52 AM4/11/13
to fireb...@googlegroups.com
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ý

Karel Nagy

unread,
Apr 11, 2013, 8:32:18 AM4/11/13
to fireb...@googlegroups.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 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

Ales Pavel

unread,
Apr 17, 2013, 1:21:53 AM4/17/13
to fireb...@googlegroups.com
nechapu proc se dnes jeste nekdo zaobira mysql, kdyz prevazne nemusi a nechapu proc na hiearchicky struktury vzdy tak slozite, vetsinou staci table polozka a table spoj_polozky  kde je id_polozka, id_parent_polozka, plus nejaka ta popiska ci uzivatelske razeni, kdyz je potreba.

AP


Dne 11. dubna 2013 14:32 Karel Nagy <na...@soma.cz> napsal(a):
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 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

--
--
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.
 
 

soma_pmt.png
Reply all
Reply to author
Forward
0 new messages