Autor Zpráva
MagicPower
Profil *
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
MagicPower:
Tady máš možnosti
http://php.vrana.cz/srovnani-dotazu-do-zavislych-tabulek.php
juriad
Profil
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0