Autor | Zpráva | ||
---|---|---|---|
MagicPower Profil * |
#1 · Zasláno: 8. 7. 2015, 15:42:19
Dobrý den,
mám dotaz na MySQL výběr z tabulky. Mám tabulku, která nese kategorie a jejich podkategorie: Kategorie id_category / parent / name (parent 0 značí jako nejvyšší hlavní kategorii) 1, 0, Auta 2, 0, Moto 3, 1, Užitková 4, 2, Skútry 5, 2, Mopedy 6, 1, Nákladní Na výstup potřebuju toto: Auta - Užitková - Nákladní Moto - Skútry - Mopedy Zajímalo by mě, zda se to nechá už takhle vysortěný vybrat jedním SQL dotazem a na výstupu mít prostě jenom echo $name v jednom cyklu. Vybrat dvouma to umím, kde nejdříve vyberu Kategorii s parentem 0 a v dalším dotaze vyberu podkategorie, které mají aktuálně vybrané ID. Nechá se to zrealizovat v jednom SQL dotaze? Nebo to musím vybírat na dvakrát? Nebo vybrat vše a prostě to opodmínkouvat pomocí dvou cyklů? Předem děkuji za každou radu. |
||
Taps Profil |
#2 · Zasláno: 8. 7. 2015, 16:04:52
|
||
juriad Profil |
#3 · Zasláno: 8. 7. 2015, 16:12:37
Jde to i jedním. Hned ukážu jak.
Způsob, jak to máš uložené (odkaz na parent) není vhodný v případě, že bys chtěl hlubší strukturu, řekněme podpodpodpodkategorie. Výhodnější je v takovém jiné uspořádání dat (viz www.slideshare.net/billkarwin/sql-antipatterns-strike-back). Pro jednoduché použití to však stačí. Další věc je, že nejvyšší prvky nemají mít parent=0, ale parent = NULL. To kvůli cizím klíčům, které zatím nepoužíváš. SELECT c.id_category AS cid, c.name AS cname, s.id_category AS sid, s.name AS sname FROM kategorie c LEFT JOIN kategorie s ON c.id_category = s.parent ORDER BY c.id_category ASC, s.id_category ASC A následně použiješ Nejčastější potíže s PHP (FAQ) » Nadpis skupiny nejen při výpisu z databáze pro vypsání kategorií. Pokud kategorie nemá podkategorie, bude vrácen jeden řádek obsahující sid a sname hodny NULL. Dost pravděpodobně nechceš pokádat pro každou kategorii nový dotaz. Můžeš ale chtít pro každou úroveň (kategorie, podkategorie, podpodkategorie) položit jeden dotaz, který vrátí data seřazené primárně podle parent. V takovém případě ale budeš mít na straně PHP netriviální množství práce. Neumožní to také okamžitý výpis - musíš provést dva dotazy a následně jejich výsledek sloučit. |
||
Časová prodleva: 9 let
|
0