Hogyan tudnám kivitelezni ezt egyetlen SQL lekérdezésben?
Egy webárzház rendszert fejlesztek éppen, és a termékkategóriákat próbálom megoldani. Van rá öteltem, méghozzá az, hogy készítek két táblát, az egyikben tárolom a kategóriákat és az elnevezésüket. Annyira egyszerű, hogy CategoryID, CategoryName
Ebből áll, a típusok nyilván int és varchar.
A másik táblában lesznek a különböző kategóriák közötti kapcsolatok, a következő mezőkkel:
RelationID int primary key auto_inrement
CategoryID int (nyilván foreign key)
ParentID int DEFAULT -1
Amelyik kategória alkategória, annak lesz ugye egy ParentID-ja, különben -1 értéket vesz fel ez a mező.
Szeretnék egy olyan tárolt eljárást készíteni, ami addig megy végig az első táblából vett CategoryID-kon, amíg és kérdezi le a leszármazott kategóriákat, amíg ki nem rajzolódik ebből egy kategória hierarchia.
Meg lehet ezt valahogyan oldani?
Én inkább a következő adatbázis szerkezetet javaslom:
Categories(CategoryID, CategoryName)
PRIMARY KEY (CategoryID)
SubCategories(CategoryID, MainCategory)
FOREIGN KEY (CategoryID)
FOREIGN KEY (MainCategory) REFERENCES Categories(CategoryID)
Tehát a Categories táblában eltárolod az összes létező kategóriát, majd egy SubCategories kapcsolótáblába benyomod, hogy melyik kategória melyik kategória alá tartozik. Ezeket utána szépen le tudod kérdezni, csak figyelj arra, hogy ha egy kategória nem alkategória (azaz nincs benne a SubCategories táblában), akkor az nem lesz benne a SubCategories táblában.
A kérdező feleslegesen el akarja tárolni "-1" értékkel azokat a kategóriákat is a második táblában, amik nem alkategóriák. Ezen kívül a RelationID nem értem, hogy miért kell, azon is lehet optimalizálni.
Az én tábláimban valahogy így nézne ki a kategóriák lekérdezése, azt elfelejtettem odaírni:
Fő kategóriák:
SELECT *
FROM Categories
WHERE CategoryID NOT IN (
SELECT CategoryID FROM SubCategories
);
Alkategóriák:
SELECT *
FROM SubCategories;
A többszintű kategória szerkezetileg annyi, hogy a SubCategories táblában több sor van, pl.:
2 | 1
3 | 2
5 | 2
Mit is jelent ez?:
- A 2-es kategória az 1-es alá tartozik.
- A 3-as kategória a 2-es alá tartozik.
- Az 5-ös kategória szintén a 2-es alá tartozik.
Grafikusan felírva:
-1
--2
----3
----5
Köszönöm szépen az eddigieket, de szerintem ezekből igazából egyik se nagyon működik megfelelően.
Olyasmire gondoltam, hogy lenne egy stored procedure, ami csak annyit tesz, hogy bemenő paraméter, történetesen a CategoryID alapján inner joinolva leszedi a kategória adatokat a két táblából.
Ezt egy másik tárolt eljárás hívja meg úgy, hogy valamiféle ciklusban lekérdezgeti egyenként a CategoryID-kat, és a CategoryID-t mint paramétert átadja az előzőekben vázolt tárolt eljárásnak.
Az a problémám ezzel, hogy nem tudom, hogy szintaktikailag ez hogyan lehetne helyes úgy, hogy működjön is.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!