payskin Posted February 15, 2008 Posted February 15, 2008 Tegyük fel, hogy van egy webáruházunk, és abban különböző kategóriákba soroljuk be a termékeket. Például: Akciófigurák Babák Járgányok Kártyajáték Kisvasútak Plüssfigurák Puzzle és kirakós Sportjátékok Társasjátékok Távirányítós modellek Az egyes kategóriák alkategóriákat is tartalmazhatnak, például a Babák kategória alatt lehetnek ilyen alkategóriák, hogy Barbie Én kicsi pónim Polly pocket A kategóriákat egy külön táblában tároljuk az adatbázisban, amely az alábbi mezőkből áll: category_id // kategória azonosítója category_status // 0 = aktív, 1 = inaktív category_name // kategória neve category_parent // melyik kategória alkategóriája (id) A fenti példánál maradva, a Babák kategória, és az "alatta levő" Baribe alkategória így néz ki: category_id = 12 category_status = 1 category_name = "Babák" category_parent = 0 category_id = 45 category_status = 1 category_name = "Barbie" category_parent = 12 Fontos! Természetesen a kategóriák nincsenek sorban az adatbázisban, tehát a Babák alkategóriái véletlenül sem közvetlenül a Babák után jönnek (ezért is írtam két különböző id-t). Amikor elindult a bolt, nem is voltak alkategóriák, csak amikor már nagyon sok lett a termék, akkor kezdték el alkategóriákba csoportosítani a játékokat. Szintén fontos: a webáruház lehetővé teszi további alkategória-szintek bevezetését, tehát a Barbie alkategóriát akár tovább is lehetne osztani a különböző Barbie sorozatok alapján ilyen alkategóriákra, hogy: Filmsztár Barbie Kőműves Barbie Száncsán Barbie A feladat: felépíteni és megjeleníteni a kategórialistát (név szerinti ábécé-sorrendben), úgy, hogy az alkategóriákat a "szintjük" szerint eltolással jelöljük. Valahogy így: Kategórianév -- Kategórianév -- Kategórianév ---- Kategórianév ---- Kategórianév -- Kategórianév Kategórianév Kategórianév Kategórianév -- Kategórianév Kategórianév -- Kategórianév -- Kategórianév Na, kicsit hosszú lett, de azért nem olyan bonyolult. Ha valami nem világos, kérdezzetek nyugodtan. Ha az segít, szívesen csinálok egy minta MySQL adatbázist. Nem kell komplett programot írni. Elég az első lekérdezéstől a kiírásig, úgyis a feldolgozás a lényeg. De nem is kell rögtön konkrét megoldással előállni, beszélgethetünk arról, hogy hogy kezdenétek neki, mit csinálnátok. Szerintem nagyon tanulságos beszélgetés alakulhat ki, sokat lehetne belőle tanulni. Annyit azért még érdekességképpen elmesélek, hogy nem légből kapott a példa: az egyik webáruházunkban többek között ez a rutin fektette ki a MySQL szervert. Kiváló open source megoldás volt, újra kellett írnom az egészet.
Pjotr Posted June 30, 2011 Posted June 30, 2011 SQL: SELECT Categories.category_id, Categories.category_name, Categories.category_parent, IF(category_id IN (SELECT DISTINCT category_parent FROM Categories), 1, 0) AS IsParent FROM Categories LEFT JOIN Categories AS Parents ON Categories.category_parent = Parents.category_id WHERE Categories.category_status = 1 AND Parents.category_status = 1 ORDER BY Categories.category_name ASC PHP: function dcat(&$from, $parent, $indent = " ") { $ret = ""; foreach ($from as $value) { if ($value['category_parent'] == $parent) { $ret = $indent . $value['category_name'] . "\n"; if ($value['IsParent']) { $ret = $ret . dcat($from, $parent, $value['category_id'], "--" . $indent); } } } return $ret; } // $cats az adatbázisből lekérdezett kategóriákból épített tömb // NULL a szülője dcat($cats, NULL); Talán. Ehhez hasonlót használok egy-két helyen, de ebben lehet hiba, mert csak on-the-fly írtam.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now