Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Autojointure : Sélection récursive.

15 réponses
Avatar
Damran
Bonjour
J'ai un petit problème.
Pour représenter des articles présent dans un niveau, j'ai un ID_PERE qui
représente donc où est attaché mon article.
Je voudrais à partir d'un niveau, récupérer tous les articles présent en
dessous de ce niveau et ce, quelques soit le nombre de sous niveau.
J'ai beau chercher, j'ai l'impression que c'est impossible en une seule
requête.
Haa là là, si la base utilisait la représentation intervallaire, je n'aurais
pas de problèmes :-( Mais je ne peut pas toucher à la base, donc je doit
faire avec.
Note : Je pose ma question ici car vous vous y connaissez en langage SQL,
mais la base est une base MySQL. Donc pas de procédure stocké pour faire des
boucles (enfin je pense) et si un autre forum est exclusivement consacré au
SQL, je suis preneur.


Si vous avez une idée, merci d'avance et même merci beaucoup ;-)

Damran

5 réponses

1 2
Avatar
Damran
C'est bon, j'ai réussit sans changer la structure de ma base.
J'ai tout simplement créé une fonction qui sort tout les ID des fils d'un
niveau passé en paramètre. Je rappel la fonction pendant que je parcours les
enregistrements afin d'avoir la récursivité.

Le tout me sert à construire ma condition Where pour ensuite lancer la
"vrais" requête qui me sortira les éléments dont j'ai besoin.

Damran


"Damran" a écrit dans le message de news:
3fb337b7$0$10411$
"Damran" a écrit dans le message de news:
3fb32f6b$0$10423$
> Bonjour
> Voici la solution si une base de donnée gère la récursivité :
> ----
> Procedure RecherchePeres (in id integer, inout reponse string)
> begin
> reponse = reponse + ', ' + (SELECT FAM_LIB
> FROM FAMILLE
> WHERE FAM_ID = ID)
> if id = 0
> then
> return
> else
> id = (SELECT FAM_PERE
> FROM FAMILLE
> WHERE FAM_ID = ID)
> end
> ----
> Il faudrait en fait que je transforme cette procédure en code (php ou


asp)
> utilisant des recordset.
> J'ai posté ici car vous connaissez bien le SQL, mais le problème dont je
> parles tournes sous MySQL/php, donc pas de procédures stocké.
>
> Et je ne vois pas trop comment fonctionne les "boucles" dans cette
> procédure.
>
> Vous avez une idée pour faire cela en php, ou asp (je porterai le code
s'il
> le faut) ? Je suppose que je doit avoir une fonction qui fait un select
sur
> l'ID, puis je devrais appeler cette fonction à partir d'elle même pour
avoir
> la récursivité. J'ai jamais fait de fonction récursive et je n'arrive


pas
> encore à m'imaginer comment se déroule ce genre d'algo.
>
> Si vous pouviez me mettre sur la voie.


J'ai oublié de préciser.
Le but serait de trouver tous les FAM_PERE concernés pour ensuite


construire
une condition à utiliser dans une autre requête : "Where FAM_PERE = 1 or
FAM_PERE = 2 ...

Damran




Avatar
Nicolas LETULLIER
Attention quand même à ta profondeur de structure, tu seras limité à 32
niveaux de récursivité.

Nicolas.


"Damran" a écrit dans le message de
news:3fb3af7a$0$13302$
C'est bon, j'ai réussit sans changer la structure de ma base.
J'ai tout simplement créé une fonction qui sort tout les ID des fils d'un
niveau passé en paramètre. Je rappel la fonction pendant que je parcours


les
enregistrements afin d'avoir la récursivité.

Le tout me sert à construire ma condition Where pour ensuite lancer la
"vrais" requête qui me sortira les éléments dont j'ai besoin.

Damran


"Damran" a écrit dans le message de news:
3fb337b7$0$10411$
> "Damran" a écrit dans le message de news:
> 3fb32f6b$0$10423$
> > Bonjour
> > Voici la solution si une base de donnée gère la récursivité :
> > ----
> > Procedure RecherchePeres (in id integer, inout reponse string)
> > begin
> > reponse = reponse + ', ' + (SELECT FAM_LIB
> > FROM FAMILLE
> > WHERE FAM_ID = ID)
> > if id = 0
> > then
> > return
> > else
> > id = (SELECT FAM_PERE
> > FROM FAMILLE
> > WHERE FAM_ID = ID)
> > end
> > ----
> > Il faudrait en fait que je transforme cette procédure en code (php ou
asp)
> > utilisant des recordset.
> > J'ai posté ici car vous connaissez bien le SQL, mais le problème dont


je
> > parles tournes sous MySQL/php, donc pas de procédures stocké.
> >
> > Et je ne vois pas trop comment fonctionne les "boucles" dans cette
> > procédure.
> >
> > Vous avez une idée pour faire cela en php, ou asp (je porterai le code
> s'il
> > le faut) ? Je suppose que je doit avoir une fonction qui fait un


select
> sur
> > l'ID, puis je devrais appeler cette fonction à partir d'elle même pour
> avoir
> > la récursivité. J'ai jamais fait de fonction récursive et je n'arrive
pas
> > encore à m'imaginer comment se déroule ce genre d'algo.
> >
> > Si vous pouviez me mettre sur la voie.
>
>
> J'ai oublié de préciser.
> Le but serait de trouver tous les FAM_PERE concernés pour ensuite
construire
> une condition à utiliser dans une autre requête : "Where FAM_PERE = 1 or
> FAM_PERE = 2 ...
>
> Damran
>
>




Avatar
Jean-Francois Cantin
Limitation que tu n'aurais pas avec ma façon de procéder dont je t'ai parlé
un peu plus haut ;-)


"Nicolas LETULLIER" a écrit dans le
message de news:
Attention quand même à ta profondeur de structure, tu seras limité à 32
niveaux de récursivité.

Nicolas.


"Damran" a écrit dans le message de
news:3fb3af7a$0$13302$
> C'est bon, j'ai réussit sans changer la structure de ma base.
> J'ai tout simplement créé une fonction qui sort tout les ID des fils


d'un
> niveau passé en paramètre. Je rappel la fonction pendant que je parcours
les
> enregistrements afin d'avoir la récursivité.
>
> Le tout me sert à construire ma condition Where pour ensuite lancer la
> "vrais" requête qui me sortira les éléments dont j'ai besoin.
>
> Damran
>
>
> "Damran" a écrit dans le message de news:
> 3fb337b7$0$10411$
> > "Damran" a écrit dans le message de


news:
> > 3fb32f6b$0$10423$
> > > Bonjour
> > > Voici la solution si une base de donnée gère la récursivité :
> > > ----
> > > Procedure RecherchePeres (in id integer, inout reponse string)
> > > begin
> > > reponse = reponse + ', ' + (SELECT FAM_LIB
> > > FROM FAMILLE
> > > WHERE FAM_ID = ID)
> > > if id = 0
> > > then
> > > return
> > > else
> > > id = (SELECT FAM_PERE
> > > FROM FAMILLE
> > > WHERE FAM_ID = ID)
> > > end
> > > ----
> > > Il faudrait en fait que je transforme cette procédure en code (php


ou
> asp)
> > > utilisant des recordset.
> > > J'ai posté ici car vous connaissez bien le SQL, mais le problème


dont
je
> > > parles tournes sous MySQL/php, donc pas de procédures stocké.
> > >
> > > Et je ne vois pas trop comment fonctionne les "boucles" dans cette
> > > procédure.
> > >
> > > Vous avez une idée pour faire cela en php, ou asp (je porterai le


code
> > s'il
> > > le faut) ? Je suppose que je doit avoir une fonction qui fait un
select
> > sur
> > > l'ID, puis je devrais appeler cette fonction à partir d'elle même


pour
> > avoir
> > > la récursivité. J'ai jamais fait de fonction récursive et je


n'arrive
> pas
> > > encore à m'imaginer comment se déroule ce genre d'algo.
> > >
> > > Si vous pouviez me mettre sur la voie.
> >
> >
> > J'ai oublié de préciser.
> > Le but serait de trouver tous les FAM_PERE concernés pour ensuite
> construire
> > une condition à utiliser dans une autre requête : "Where FAM_PERE = 1


or
> > FAM_PERE = 2 ...
> >
> > Damran
> >
> >
>
>




Avatar
Damran
"Jean-Francois Cantin" a écrit dans le
message de news:

Limitation que tu n'aurais pas avec ma façon de procéder dont je t'ai


parlé
un peu plus haut ;-)


C'est vrais, mais si je modifie la base, autant le faire pour de bon et donc
passer à la représentation intervallaire.
C'est pour les catégories d'un magasin en ligne, ça ne dépassera jamais les
10 niveaux. De plus, il aurait fallut gérer des sessions là où il n'y en
avait pas besoin (la sélection de la personne en cour et pas celle d'une
autre visite).
Par contre, c'que c'est pas optimisé, ho là là ! ;-) Mais bon, c'est du "en
attendant"

Merci à vous tous
Damran
Avatar
Nicolas LETULLIER
Si tu as vraiment un problème de performance, ne peux-tu pas mettre en
oeuvre une solution intervallaire en parallèle de ta solution actuelle ? Tu
peux imaginer une mise à jour automatique par trigger sur ton ancienne table
et utiliser les nouvelles pour ta recherche. Avec toutes les explications et
le code de Fred sur son site, la solution parallèle ne devrait pas être trop
longue à mettre en oeuvre je pense.

Comme ça, tu as ton implémentation, et le jour où tu veux tout basculer en
intervalle, tu n'as que ton ancien code à reprendre.

Une idée comme ça...

Nicolas.



"Damran" a écrit dans le message de
news:3fb49640$0$231$

"Jean-Francois Cantin" a écrit dans le
message de news:
>
> Limitation que tu n'aurais pas avec ma façon de procéder dont je t'ai
parlé
> un peu plus haut ;-)
C'est vrais, mais si je modifie la base, autant le faire pour de bon et


donc
passer à la représentation intervallaire.
C'est pour les catégories d'un magasin en ligne, ça ne dépassera jamais


les
10 niveaux. De plus, il aurait fallut gérer des sessions là où il n'y en
avait pas besoin (la sélection de la personne en cour et pas celle d'une
autre visite).
Par contre, c'que c'est pas optimisé, ho là là ! ;-) Mais bon, c'est du


"en
attendant"

Merci à vous tous
Damran




1 2