Topic: Keleto lygių kategorijų MySQL pritaikymas

Sveiki,
Norėčiau sužinoti kaip padaryti tokią kategorijų sistemą kaip skelbiu.lt.
Galvoju reik daryt tokias eilutes:

id | produktas | parent_id

1    blah        0
2    blah_1      1
3    n_cat       0
4    n_cat_1     3

Gal patartumėt kaip tai padaryt paprasčiausiai? Dėkui.

Re: Keleto lygių kategorijų MySQL pritaikymas

Kaip padaryta skelbiu.lt neaišku. Gali būti labai paprastai gali būti ir sudėtingai.

Tu ką čia parodei yra jau tikriausiai vienas iš paprastesnių schemos atžvilgiu sprendimų. Gali bandyti jį naudoti. Tik neaišku kokias operacijas norėsi daryti turėdamas tokią schemą, nes tam tikrais atvejais gali tekti rašyti labai sudėtingas ir lėtas užklausas (-;

Re: Keleto lygių kategorijų MySQL pritaikymas

Pasirinkau MPTT metodą, jau lyg ir perpratau jį, bet dar turiu klausimų:
Tarkim turiu tokią struktūrą:
http://www.ipix.lt/thumbs/18496369.jpg
Kokią mysql užklausą daryt turėčiau, kad gaut 0 lygio elementus(Vaisiai, daržovės). Ar geriau turėti atskirus table'us?

Re: Keleto lygių kategorijų MySQL pritaikymas

be left ir right naudok ir parent_id stulpelį. Taip lengvai ir be nuobaudų spartai gausi norimą rezultatą.  Tie keli besidubliuojantys baitai nemaišys ( su susimovus viename modelyje, bus galimybė atstatyti duomenis pagal kitą :P), o kai tėvo/vaiko ryšio nebe pakaks, naudok MPTT.

Berods sitepoint'e yra geras straipsnis šia tema.

5 (edited by neturiuVardo 2010-03-11 16:27:02)

Re: Keleto lygių kategorijų MySQL pritaikymas

LOCK TABLE test WRITE;
SELECT @myRight := rgt FROM test
WHERE parent = 'AC';
UPDATE test SET rgt = rgt + 2 WHERE rgt > @myRight;
UPDATE test SET lft = lft + 2 WHERE lft > @myRight;
INSERT INTO test(produktas, lft, rgt, parent, level) VALUES('qwe', @myRight + 1, @myRight + 2, '', '');
UNLOCK TABLES

Bandau įvykdyt komandą per PHP - meta klaidą:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT @myRight := rgt FROM test WHERE parent = 'AC'; UPDATE test SET rg' at line 2

Bet įvykdžius tiesiai per phpMyAdmin - viskas puikiai veikia. Kas čia negerai?
EDIT:
Na, jau supratau, kad su mysql_query keleto užklausų neįmanoma padaryti. Reik daryt su mysqli_multi_query, bet kažko taip pat nenori veikt...

mysqli_multi_query($con, "LOCK TABLE test WRITE;
SELECT @myRight := rgt FROM test
WHERE parent = '$cat';
UPDATE test SET rgt = rgt + 2 WHERE rgt > @myRight;
UPDATE test SET lft = lft + 2 WHERE lft > @myRight;
INSERT INTO test(produktas, lft, rgt, parent, level) VALUES('$produktas', @myRight + 1, @myRight + 2, '', '');
UNLOCK TABLES") or die(mysql_error());
Warning: mysqli_multi_query() expects parameter 1 to be mysqli, null given in C:\xampp\htdocs\skelbiu\config.php on line 136
$con = mysqli_connect($host, $user, $pw, $db);

Re: Keleto lygių kategorijų MySQL pritaikymas

O kur nustatai, kad pavyko sėkmingai prisijungti prie DB?

Re: Keleto lygių kategorijų MySQL pritaikymas

Heh, užmiršau global $con; funkcijai parašyt, tai ir nerasdavo $con :)
Viskas puikiai veikia dabar.