Avatar billede cyberjelle Nybegynder
18. august 2006 - 23:43 Der er 7 kommentarer og
1 løsning

et bibliotekstræ

genåbning af del 1 i :http://www.eksperten.dk/spm/725796

Et eksempel!
Jeg har flg tabel:

|id| - |dir| - |subdir_to|

|1| - |tools| - |0|
|2| - |hammer| - |1|
|3| - |screwdriver| - |1|
|4| - |fruits| - |0|
|5| - |yellow_fuits| - |4|
|6| - |green_fuits| - |4|
|7| - |apple| - |6|
|8| - |banana| - |5|
|9| - |grape| - |6|

Som i sikkert allerede kan forestille jer, er det et bibliotekstræ.


1. Er det muligt, med EN query, at fx få stien til grape biblioteket? Dvs. følgende output:
|4| - |fruits| - |0|
|6| - |green_fruits| - |4|
|9| - |grape| - |6|
Avatar billede arne_v Ekspert
19. august 2006 - 01:17 #1
ikke universelt

men op til N dybde kan du lave N self joins med UNION imellem (den første er ikke en self join men ...)
Avatar billede cyberjelle Nybegynder
19. august 2006 - 09:55 #2
Øv øv øv....
Avatar billede razmuz_dk Nybegynder
19. august 2006 - 12:44 #3
Uden at være 100% sikker vil jeg da mene det kan laves med stored produceres introduceret i mysql 5 - dette muliggør while's og loop's i mysql.

Så vil du kunne hente hele dit "træ" med CALL get_tree(); eller lign. Det kan så diskuteres hvorvidt et CALL der igang sætter flere queries, i sig selv er én query.

Jeg vil anbefale du selv dykker ned i dokumentationen her:
http://mysql.com/doc/refman/5.0/en/stored-procedures.html

Happy reading :P
Avatar billede cyberjelle Nybegynder
19. august 2006 - 21:10 #4
Tak... Jeg prøver at læse, når jeg vågner i morgen :)
Avatar billede arne_v Ekspert
20. august 2006 - 01:15 #5
det kan det faktisk

jeg synes ikke at det er nemt, men følgende ser ud til at virke:

DELIMITER //
CREATE PROCEDURE lookup(_name varchar(50))
BEGIN
    DECLARE _id INTEGER;
    DECLARE _parent INTEGER;
    SELECT id,parent INTO _id,_parent FROM stuff WHERE name = _name;
    SET @sql = CONCAT('SELECT * FROM stuff WHERE id IN (', CAST(_id AS CHAR));
    WHILE _parent <> 0 DO
        SET @sql = CONCAT(@sql,',');
        SET @sql = CONCAT(@sql,CAST(_parent AS CHAR));
        SET _id = _parent;
        SELECT parent INTO _parent FROM stuff WHERE id = _id;
    END WHILE;
    SET @sql = CONCAT(@sql,')');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END//
DELIMITER ;
Avatar billede arne_v Ekspert
20. august 2006 - 01:23 #6
og så kan du ærge dig over at du ikke kører Oracle hvor det bare er:

SELECT * FROM stuff START WITH name = 'grape' CONNECT BY PRIOR parent = id;
Avatar billede arne_v Ekspert
20. august 2006 - 01:23 #7
(og hvis du undrer dig så hedder mit dir felt name og mit subdir_to felt parent)
Avatar billede cyberjelle Nybegynder
22. august 2006 - 19:03 #8
Jeg siger tak til jer begge.
Jeg har endnu ikke testet det endnu, men har i mellemtiden fået opdateret til mysql 5.
Jeg lader lige høre fra mig.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester