arboressence dynamique

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : arboressence dynamique

Re: arboressence dynamique

par Spols » 27 sept. 2012, 17:25

Merci, mais supprimer le WHERE revient à me rajouter en première ligne les enfants en plus des parents.

J'ai donc été vers l'UNION ALL

et voici ce que j'ai trouvé de fonctionnelle
SELECT t1.C2 AS titre1, t1.C1 AS id1, t2.C2 AS titre2, t2.C1 AS id2, t3.C2 AS titre3, t3.C1 AS id3
FROM titre t1
LEFT JOIN parent p1 ON t1.C1 = p1.c1
LEFT JOIN parent p2 ON t1.C1 = p2.c2
LEFT JOIN titre t2 ON t2.C1 = p2.c1
LEFT JOIN parent p3 ON t2.C1 = p3.c2
LEFT JOIN titre t3 ON t3.C1 = p3.c1
WHERE p1.c1 <=> NULL
UNION
SELECT t1.C2, t1.C1
FROM titre t1
LEFT JOIN parent p1 ON t1.C1 = p1.c1
LEFT JOIN parent p2 ON t1.C1 = p2.c2
WHERE p1.c1 <=> NULL AND p2.c1 IS NOT NULL
ORDER BY id1 ASC, id2 ASC, id3 ASC
Si vous avez encore une idée pour s'affranchir de connaitre le niveau maximum de lien de parenté, je laisse ce sujet ouvert

Edit : Je me suis rendu compte de l'inutilité d'un UNION ALL avec un DISTINCT dans la 2ème requète, j'ai donc corrigé mon post

Re: arboressence dynamique

par xTG » 27 sept. 2012, 16:37

Bah supprimes ta clause WHERE dans ce cas si tu veux une ligne avec les NULL. ^o^
Ou bien si cela casses le retour tu peux faire une autre requête et joindre les deux avec UNION.

arboressence dynamique

par Spols » 27 sept. 2012, 15:56

Bonjour à tous,

Je cherche à faire une requète un peu spécial

voici une structure simplifié de mes tables
La table titre qui fait correspondre un titre à un identifiant unique

Code : Tout sélectionner

C1 C2 ______ 0 t1 1 t2 2 t3 3 t4 4 t5 5 t6 6 t7 7 t8 8 t9 9 t10 10 t11
Et la table parent qui fait correspondre à l'identifiant unique de la table titre à ce même identifiant de son parent

Code : Tout sélectionner

c1 c2 ______ 4 3 5 3 7 6 8 7 9 7 10 6
J'ai trouvé une requète :
SELECT t1.C2, t2.C2, t3.C2
FROM titre t1
LEFT JOIN parent p1 ON t1.C1 = p1.c1
LEFT JOIN parent p2 ON t1.C1 = p2.c2
LEFT JOIN titre t2 ON t2.C1 = p2.c1
LEFT JOIN parent p3 ON t2.C1 = p3.c2
LEFT JOIN titre t3 ON t3.C1 = p3.c1
WHERE p1.c1 <=> NULL
Qui me donne presque ce que je veux, c'est à dire ceci :

Code : Tout sélectionner

t1 t2 t3 t4 t5 t4 t6 t7 t8 t9 t7 t8 t10 t7 t11
J'aimerais avoir pour chaque titre ayant des enfants une ligne suplémentaire suivi de NULL ceci donc

Code : Tout sélectionner

t1 t2 t3 t4 t4 t5 t4 t6 t7 t7 t8 t9 t7 t8 t10 t7 t11
Question subsidiare, est il possible de s'affranchir du niveau maximum d'enfant. Dans cet exemple, il y a J'usquà 2 niveau, ce qui demande les 2 dernière paires de LEFT JOIN. Si j'ai un nombre plus grands voir inconnu ou illimité de possibilité de niveau d'enfant, est il possible de construire une requète qui me donnerai mon résultat?
Une boucle dans ma requète ?