Autor Zpráva
mitr
Profil
Přemýšlel jsem jak udělat takovou ideální sktukturu kategorií shopu.

Zatím jsem vymeslel toto:
id - unikátní id autoincrement
id_nadraz - id nadřazené kategorie
level - 0 hlavní kategorie, 1 podřazená .. atd
pořadí - pořadí v aktuální nadřazené kategorii

level - aby bylo možné vybrat všechny výrobky které jsou v kategoriích s větším level a podřazeny pod nějakou kategorií.
Ale stejně to pořád není ještě ono, když budu chtít vybrat např všechno zboží pod nějakou kategorií a v všech podkategoriích tak to nebude s tímto tak jednoduché.
Kajman_
Profil *
Problém bude získat seznam všech podkategorií k jedné, což jedním dotazem asi nepůjde (leda si naprogramovat nějakou funkci přímo v sql).

Takže, dokud by rostl počet kategorií v průběžném výsledku dotazu, hledal bych něco takového

select id from kategorie where id in ($prubezny_seznam) or id_nadraz in ($prubezny_seznam)

Tady takových dotazů by bylo víc, záleží na tom, jak moc to bude zanořené. Prostě se skončí, až ten seznam bude mít stejný počet položek jako minulý.

Pak už se jen vypíš seznam zboží

select * from zbozi where kategorie in ($prubezny_seznam)


Možná je lepší řešení.
mila
Profil
Tomuto se říká tranzitivní uzávěr.
- Položka zná svého rodiče a ty potřebuješ vybrat všechny potomky nebo předky.

Mysql ho neumí, takže potřebuješ prakticky provést dotaz pro každou položku, což může být neúnosné. Například Oracle ho ale umí (jak jsem ale slyšel, tak je to stejně pomalé).

Řeěení existuje několik:
- Smířít se s mnoha dotazy.
- Generovat si pomocnou tabulku.
- Nastavit maximální úroveň zanoření.
- Dát jim id ve ve tvaru cislohlavni.cislopodkategorie.cislopodpodkategorie.... Bude textové a vybýrat to budeš pomocí like (je třeba malá čísla doplnit nulami). Pravda není to také dvakrát rychlé, ale vcelku elegantní.
- Pěkné řešení jsem vyděl na intervalu. Využívá algoritmus pro průchod grafem do hloubky. http://interval.cz/clanky/metody-ukladani-stromovych-dat-v-relacnich-d atabazich/
mitr
Profil
Díky Vám oběma za odpověď.

mila
PostgreSQL "tranzitivní uzávěr" neumí ?
Nikdy jsem ten pojem neslyšel, jdu si ale přečíst ten článek na Intervalu, díky za odkaz ;-)
O nějakém řešení 0100, 0101 atd samozřejmě s více místy jsem také přemýšlel, ale nepřipadá mi to moc "čisté" ale asi to fakt bude to nejrychlejší.
mitr
Profil
Tak jsem si to přečetl i s diskusí pod článkem a nic z toho mi nepřipadalo jako ideální.
Vyberu si možná některou zmetod pro udržování přehledu v DB, ale menu se nebude měnit tak často, možná že si vygeneruju do souboru menu a ke každé položce i id všech jeho podpoložek, tak by z toho byl jen jeden dotaz a samozřejmě při každém přidávání kategorií se vše předělá, ale jak jsem říkal nebu se moc často něco přidávat / upravovat, jestli se to udělá 2x do týdne tak to je moc :)
Toto téma je uzamčeno. Odpověď nelze zaslat.