29. december 2023 - 23:17Der er
4 kommentarer og 1 løsning
Opret URL via database-struktur
Hej eksperter
Jeg har en database med kategorier, hvori jeg ønsker, ud fra et id, at få returneret url'en. I dag har jeg en funktion, som løber igennem alle rækkerne, men for at undgå for mange forespørgsler tænker jeg, om det er muligt at udføre i én forespørgsel.
Databasen id level url 1 null movies 2 1 dvd 3 2 horror 4 2 action
Null er top-kategori, id 2 er en underkategori af id 1 osv.
Eksempelvis ønsker jeg ved forespørgsel på id 3, at resultatet er: "movies/dvd/horrer"
Forespørgsel på id 2 vil være: "movies/dvd".
Er det muligt, at få ovenstående ud fra én forespørgsel, eventuelt ud fra en array eller lignende?
En forespørgsel skal lave et loop igennem rækkerne i databasen, med start fra det id der bliver angivet, og via loopet løbe igennem de id'er som "level" referere til.
Jeg ved slet ikke om det kan lade sig gøre og der egentlig blot et forsøg på et alternativ end det beskrevne.
Jeg ønsker at kunne forespørge på eksempel "id 4" og derfra få lavet et loop igennem databasen og få resultatet "movies/dvd/action", da "id 4" er på "level 2" som i følge id er "dvd". Dvd er i "level 1" som er "movies", ergo id 1. Giver det mening?
mysql> mysql> SELECT t1.part,t2.part,t3.part,t4.part -> FROM tt t1 LEFT JOIN tt t2 ON t1.parent=t2.id -> LEFT JOIN tt t3 ON t2.parent=t3.id -> LEFT JOIN tt t4 ON t3.parent=t4.id -> WHERE t1.id = 3; +--------+------+--------+------+ | part | part | part | part | +--------+------+--------+------+ | horror | dvd | movies | NULL | +--------+------+--------+------+ 1 row in set (0.00 sec)
mysql> mysql> SELECT t1.part,t2.part,t3.part,t4.part -> FROM tt t1 LEFT JOIN tt t2 ON t1.parent=t2.id -> LEFT JOIN tt t3 ON t2.parent=t3.id -> LEFT JOIN tt t4 ON t3.parent=t4.id -> WHERE t1.id = 4; +--------+------+--------+------+ | part | part | part | part | +--------+------+--------+------+ | action | dvd | movies | NULL | +--------+------+--------+------+ 1 row in set (0.00 sec)
Og hvis nogen undrer sig over hvad Oracle kan gøre bedre:
SQL> CREATE TABLE tt ( 2 id INTEGER NOT NULL, 3 parent INTEGER, 4 part VARCHAR(32), 5 PRIMARY KEY(id) 6 );
Table created.
SQL> INSERT INTO tt VALUES(1, NULL, 'movies');
1 row created.
SQL> INSERT INTO tt VALUES(2, 1, 'dvd');
1 row created.
SQL> INSERT INTO tt VALUES(3, 2, 'horror');
1 row created.
SQL> INSERT INTO tt VALUES(4, 2, 'action');
1 row created.
SQL> SQL> SELECT part FROM tt START WITH id = 3 CONNECT BY PRIOR parent = id;
PART -------------------------------- horror dvd movies
SQL> SELECT part FROM tt START WITH id = 4 CONNECT BY PRIOR parent = id;
PART -------------------------------- action dvd movies
SQL> SQL> DROP TABLE tt;
Table dropped.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.