La communauté ALL HTML c'est 58004 membres à ce jour dont 1 inscrits aujourd'hui et 29 depuis une semaine.

  • imprimer
  • aide

Forum de discussions « Modélisation - Algorithmique »

Retrouvez les publications relatives à ces discussions dans notre rubrique algorithmique et méthodes.

requête récursive

liste des forums liste des discussions Participer à la discussion

Photo de cedric59 Message publié le mardi 05 août 2003 à 16 h 38 par cedric59. cedric
bonjour,

dans une table j'ai 3 champs : id_element, element, et id_element_parent

ainsi, chaque element peut etre relié à un élément père

j'aimerais savoir si c'est possible en SQL de faire une requête récursive, à savoir d'affichier tous les fils d'un élément, et aussi ses petits-fils, arrières petits-fils, etc, jusqu'au bout...

ou alors faut-il faire une fonction récursive en PHP avec des tableaux ou on met les resultats et du coup tout un barda compliqué?

merci si vous pouvez m'aider :-)
Photo de Séb. Message publié le mardi 05 août 2003 à 17 h 34 par Séb..
Salut !
Un truc qui manque à SQL : la gestion de la récursivité.
=> Tu vas devoir passer par PHP.
Photo de cedric59 Message publié le mercredi 06 août 2003 à 10 h 59 par cedric59. cedric
ok
merci pour cette info

après recherche, je me suis appercu que j'avais le choix entre :

1/ gérer la table de cette manière et faire uen fonction recursivederrière en PHP au moment ou je dois rechercher l'arborescence

ou

2/ utiliser une représentation par intervalle (chaque element est defini par un bord droit et un bord gauche, ses fils ayant des bornes comprises dans cet intervalle), auquel cas l'insertion d'un élément demande une mise à jour de bcp d'éléments, ce qui nécessite une transaction SQL.

que me conseillez-vous?
comment gérer l'interfacage d'une transaction MYSQL avec PHP?
ou trouver de la bonne doc la dessus ?

merci si vous pouvez m'aider :-)
Photo de Séb. Message publié le mercredi 06 août 2003 à 11 h 18 par Séb..
La représentation par intervalle peut sembler élégante (article sur http://sqlpro.developpez.com/ pour ceux que ça intéresse) mais demande un certain temps d'adaptation et fait effectivement pas mal travailler le serveur à l'insertion, ce qui peut être embêtant avec MySQL qui ne gère pas les transactions (sauf si tu as accès aux tables InnoDB).

À ta place je ferai la 1 avec ou sans mysql_query( ) en récursif selon la structure de ton arbo.

"ou trouver de la bonne doc la dessus ?"
Sur le site officiel MySQL http://www.mysql.com/ [;)]
Photo de cedric59 Message publié le mercredi 06 août 2003 à 15 h 31 par cedric59. cedric
sur developpez.com, on me conseille de fonctionner par intervalle à partir du moment ou une des conditions suivantes est respectée :

1- l'arbre est profond (plus de 5 niveaux)
2- l'arbre est large (plus de 100 éléments sur un même niveau)
3- l'arbre contient beaucoup de valeurs (à partir de 200 à 300 éléments)
4- la majorité des requêtes sont des requêtes d'interrogation - SELECT (au moins 50% des requêtes)

pour ma part je suis dans le cas 3 et 4, et dans le cas 2 dans certains cas...

me conseillez vous néanmoins d'abandonner ce fonctionnement?


d'autre part, etant donné que MYSQL ne gere pas les transactions, comment cela se passe? une action lancée est systematiquement prioritaire sur les autres? la table est bloquée tant que la requête n'est pas terminée...?

par ailleurs, quels sont les autres moyens de fonctionner que d'utiliser mysql_query()?

merci si vous pouvez m'aider :-)
Photo de candide Message publié le mercredi 06 août 2003 à 16 h 15 par candide. Candide:-= j'trouve que ça sent bon la neige... pas vous?
j'ai fais (à l'époque) un site se présentant comme un explorateur windows. Il s'agissait d'un catalogue.
J'avais pour cela utilisé essentiellement le php puisque ma structure d'arbre tenait dans une seule table.
Là ou je n'avais pas été très "élégant" tenait dans le fait que j'avais du utiliser des structures de données particulièrent à stocker dans la dite table.
Néanmoins, le script était très rapide et n'effectuait que peu de requètes vers la base de données...
Photo de cedric59 Message publié le vendredi 08 août 2003 à 16 h 03 par cedric59. cedric
bonjour,
toujours pour ce probleme de choix de représentation de la base...
(intervalle/classique avec récursivité), voila ce que j'envisage de faire étant donné que mes requetes seront à 90% des select :

utiliser une représentation par intervalles avec en + une référence à l'ID parent pour plus de lisibilité au sein de la table (retrouver tres facilement le père de l'élément).

qu'en pensez-vous?

merci si vous pouvez m'aider :-)
Photo de Séb. Message publié le vendredi 08 août 2003 à 16 h 24 par Séb..
Salut !
Je déplace la conversation dans le salon modélisation.
Photo de cedric59 Message publié le lundi 11 août 2003 à 10 h 49 par cedric59. cedric
yop,

je continue à me renseigner et voilà ce que j'ai trouvé pour éviter l'usage des transactions :

Un double représentation : représentation pere/fils récursive + représentation par intervalle

j'utilise l'intervalle pour les select (+ rapide)

pour les insert et les upadate, j'utilise la representation pere-fils, puis, apres chacune des requetes de ce type, j'effectue une reconstruction complete de l'arbre pour redefinir les intervalles gauches et droits

cela est géré en PHP de maniere recursive, et evite ainsi l'utilisation des transactions

qu'en pensez-vous ? :-)
Photo de candide Message publié le lundi 11 août 2003 à 11 h 01 par candide. Candide:-= j'trouve que ça sent bon la neige... pas vous?
Je ne suis pas assez calé en BDD pour faire une bonne critique, mais je pense qu'un développement objet avec un maximum de tratement en php avec toutes les fonction ki vont bien me semble plus propre. Attend quand même l'avis de maitre Seb.

@++

[:-(p]suis fatigué...
Photo de 20100D Message publié le lundi 20 octobre 2003 à 22 h 15 par 20100D. 20100 1000 anes dans 1 prés et 120 dans l'aut'e alors.... Gestionnaire de fichiers audios en ligne : http://perso.wanadoo.fr/madvincent/MadPlayer/ SQL, VB, VBA, NCL, C/C++, etc : http://www.cv-vincent-dallaporta.fr.st
Salut Cedric59

Les fonctions récursives, c'est beau, c'est conci mais c'est infernal à maintenir...

Il faut en faire, pour le plaisir ou dans certain cas de limitation matériel.

Sinon il faut éviter. En plus la fonction n'est désallouée qu'en fin de traitement. Si elle est mal écrite et si elle utilise beaucoup de variable locale, rapidement la pile va s'incrémenter...

Autrement dit, si le nombre d'ittération n'est pas connu à l'avance, et peut facilement crever le plafonds, pour moi il y danger...

J'aime bien, mais je suis plus de l'avis de Candide.
A+

Photo de SQLpro Message publié le dimanche 13 janvier 2008 à 22 h 56 par SQLpro. Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Vous pouvez utiliser des requêtes récursives à la norme SQL:1999 si votre SGBDR le supporte : MS SQL Server, IBM DB2 et Sybase ASE supportent les CTE (Common table Expression) qui permettent de telles requêtes.
Pour une étude approfondie, voire l'article que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/sqlserver/cte-recursives/

A +

liste des forums liste des discussions Participer à la discussion

Vous devez obligatoirement vous identifier en tant que membre pour participer à cette discussion.

ACCÉS COMMUNAUTÉ

Rejoignez ALL HTML

Publiez vos articles, actualités, communiqués ... Donnez votre avis, partagez votre réseau, rencontrez d'autres membres et participez à la vie de la communauté.

Les 5 dernières discussions