2008-10-08 17 views
1

J'ai une table mysql avec des albums. Chaque album peut être un album de premier niveau ou un album enfant d'un autre album. Chaque album a un nom de dossier qui est le nom du dossier dans lequel se trouvent ses images. Chaque album a aussi un champ appelé parent qui est l'identifiant de l'album parent. Donc, si j'ai un chemin à une image comme ceci:Concaténation d'un nombre arbitraire de lignes de chaînes dans mysql (requête hiérarchique)

root/album1/album2/image1.jpg 

alors la table de l'album dans la base de données ressemblera à ceci:

id parent foldername 
1 NULL root 
2 1  album1 
3 2  album2 

La question est alors, comment puis-je obtenir le chemin imprimé plus tôt à partir de cette table avec seulement mysql?

Répondre

2

Cet article explique une façon de le faire: linky

+0

Veuillez considérer l'approche décrite sur la ** DEUXIÈME PAGE ** de cet article. Ceci est parfois appelé l'approche des "ensembles imbriqués". –

0

totalement non testé et typé du haut de ma tête ...

DECLARE @FOLDER VARCHAR(200) 
DECLARE @TOPID AS INT 
DECLARE @MYID As int 

CREATE TABLE #tmp 
(
    [id] INT, 
    [path] VARCHAR(50) 
) 

DECLARE tempCursor CURSOR FOR SELECT id FROM albums ORDER BY id 
OPEN tempCursor 

FETCH NEXT FROM tempCursor INTO @TOPID 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @FOLDER = '' 
    SET @MYID = @TOPID 

    WHILE @MYID is not null 
    BEGIN 
     SELECT @MYFOLDER = foldername FROM albums WHERE id = @MYID 
     SET @FOLDER = @MYFOLDER + '/' + @FOLDER 
     SELECT @MYID = parent FROM albums WHERE id = @MYID 
    END 

    INSERT INTO #tmp 
    SELECT @TOPID, @FOLDER 

    FETCH NEXT FROM tempCursor INTO @TOPID 
END 
CLOSE tempCursor 
DEALLOCATE tempCursor 

SELECT * FROM #tmp 
DROP TABLE #tmp 

Cela devrait au moins vous donner une idée comment obtenir votre noms de chemins. Vous n'avez jamais spécifié où vos noms de fichiers ont été stockés.

BTW, ça va être lent. Je déteste utiliser les curseurs ...

7

Je ne suis pas sûr de stocker un arbre dans la base de données est une bonne idée ...

Pour garder peut-être simplement votre problème juste stocker le chemin complet d'un album dans une colonne de votre table ...

id parent path   foldername 
1 NULL /   root 
2 1  /root/   album1 
3 2  /root/album1/ album2 
+2

Il s'agit d'un cas où la normalisation de la base de données a causé plus de problèmes qu'elle n'en a résolu. C'est une excellente solution qui permet d'économiser beaucoup de travail. – BoltBait

0

DB2, SQL Server, PostgreSQL, Oracle et tout le soutien commun expressions de table (CTE), qui peut être utilisé à cette fin. Oracle a également le mot clé "CONNECT BY".

Je sais que cela ne résout pas votre problème, mais peut-être que cela aidera quelqu'un d'autre à chercher une solution sur autre chose que MySQL. Dans votre cas, pour des raisons de performances, je recommande de stocker le chemin d'accès complet dans une colonne. La gestion des données dénormalisées sur insert/update se rentabilisera probablement plusieurs fois lors des lectures.