Jump to content

Feladat


payskin
 Share

Recommended Posts

payskin

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.

Link to comment
Share on other sites

  • 3 years later...
Pjotr

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.

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...