OVH Cloud OVH Cloud

Recursivite

7 réponses
Avatar
Sylvain
Bonjour à tous,

voici les champs de ma table announce : ann_id, titre, rank( = toujours 0 )

voici les champs importants de ma table answer:
ans_id, titre, rank, ans_ann_id, ans_ans_id


Je veux faire une sortir de forum en Php-mysql en utilisant les deux
tables ci dessous.

Pour les enregistrements, tout se passe à merveille, mais c'est plus
compliqué pour l'affichage.
Pour ce dernier, je veux afficher les réponses comme pour un forum, cad
des réponses associées à des questions, et des réponses associées à des
réponses de questions.


exemple de table :
*annouce:
ann_id | titre | rank
1 | annonce1 | 0

*answer:
ans_id | titre | rank | ans_ann_id |
ans_ans_id
1 | rep1 annonce1 | 1 | 1 | 0
2 | rep2 annonce1 | 1 | 1 | 0
3 | rep1 of rep1 | 2 | 1 | 1
4 | rep1 of rep1 of rep1 | 3 | 1 | 3
5 | rep3 annonce1 | 1 | 1 | 0
6 | rep1 of rep2 | 2 | 1 | 2
...



Je suis très mauvais en algo. Comment dois-je faire cela d'une façon
dynamique ?


Je voudrais afficher cela de la manière suivante :

Annouce1.

-rep1 annonce1
--rep1 of rep1
---rep1 of rep1 of rep1

-rep2 annonce1
--rep1 of rep2

-rep3 annonce1




Merci pour votre aide.

7 réponses

Avatar
christophe.meresse
voici les champs de ma table announce : ann_id, titre, rank( = toujours 0 )

voici les champs importants de ma table answer:
ans_id, titre, rank, ans_ann_id, ans_ans_id



Si c'était moi je ne ferais qu'une seule table (message pour
l'exemple) pour les annonces et les reponses
avec les champs:

mes_id, titre, rank, mess_mess_id

Comme cela plus besoin de traiter 2 cas different suivant que c'est une
reponse à une reponse ou une reponse à une annonce.
Et si tu veux obtenir uniquement les annonces tu peux toujours le faire
avec un "WHERE mess_mess_id=0".

Je voudrais afficher cela de la manière suivante :
[snip]


Pour ca il faut effectivement utiliser une fonction recursive. Cherche
un peu sur google groups "recursive affichage php" ca a déjà été
expliqué des tas de fois sur ce newsgroup ou sur d'autre.

Christophe

Avatar
loufoque
Sylvain a dit le 15/09/2005 à 13:03:

voici les champs de ma table announce : ann_id, titre, rank( = toujours 0 )

voici les champs importants de ma table answer:
ans_id, titre, rank, ans_ann_id, ans_ans_id


Je veux faire une sortir de forum en Php-mysql en utilisant les deux
tables ci dessous.

[...]


SQL et recursivité ne font pas bon ménage, trop de requêtes successives
pour l'affichage alors que ce sera la tâche la plus courante de ton
application.
Tu ferais mieux d'utiliser une technique alternative pour représenter
ton arbre, comme les Nested Sets.

Avatar
Marc

Pour ca il faut effectivement utiliser une fonction recursive. Cherche
un peu sur google groups "recursive affichage php" ca a déjà été
expliqué des tas de fois sur ce newsgroup ou sur d'autre.


en fait il s'agit de placer un arbre (tree) dans une base
de données qui elle est plate. Donc plutot s'orienter avec
Tree et database, non ?

Avatar
christophe.meresse
SQL et recursivité ne font pas bon ménage, trop de requêtes successives
pour l'affichage alors que ce sera la tâche la plus courante de ton
application.


Oui effectivement mais si on estime qu'il n'y aura pas trop de donnees,
on peut faire la requete sql pour tout recuperer dans une table et
faire la recursivité en memoire. A mon avis c'est jouable comme cela
avec même plusieurs milliers de records.
Et ensuite si on veut faire mieux, il faut gerer un binary tree pour
pouvoir obtenir facilement avec un select une petite partie de l'arbre
(Juste quelque question avec leur reponses dans ce cas precis)
Pour ca, il y a un article de Gijs Van Tulder que j'avais trouvé très
bien fait:
<http://www.sitepoint.com/article/hierarchical-data-database>

A+
Christophe

Avatar
loufoque
a dit le 15/09/2005 23:42:

Pour ca, il y a un article de Gijs Van Tulder que j'avais trouvé très
bien fait:
<http://www.sitepoint.com/article/hierarchical-data-database>


Il s'agit effectivement des Nested Sets.
Son article n'est pas terrible du tout je trouve.

Il ne propose que 4 actions différentes, et l'une est quasi-inutile et
deux erronnées alors que pour pouvoir les utiliser on aurait besoin de
savoir faire bien plus d'actions.

Par exemple dans sa fonction display_tree il fait deux requêtes, stocke
des données en mémoire, fait des tests etc. tout ça pour obtenir le
niveau alors qu'il pourrait demander à son SGBD de lui calculer le
niveau d'imbrication en même temps qu'il lui fournit les données en une
requête.

Ensuite, pour son code d'insertion, il oublie de préciser qu'il est
indispensable de faire une transaction, sans quoi, tout peut être bousillé.

Avatar
christophe.meresse

a dit le 15/09/2005 23:42:

Pour ca, il y a un article de Gijs Van Tulder que j'avais trouvé très
bien fait:
<http://www.sitepoint.com/article/hierarchical-data-database>


Il s'agit effectivement des Nested Sets.
Son article n'est pas terrible du tout je trouve.
Il ne propose que 4 actions différentes, et l'une est quasi-inutile et
deux erronnées alors que pour pouvoir les utiliser on aurait besoin de
savoir faire bien plus d'actions.

Par exemple dans sa fonction display_tree il fait deux requêtes, stocke
des données en mémoire, fait des tests etc. tout ça pour obtenir le
niveau alors qu'il pourrait demander à son SGBD de lui calculer le
niveau d'imbrication en même temps qu'il lui fournit les données en une
requête.


Ah, bon, il est vrai que je n'ai pas passé de temps à comparer de
nombreux articles et celui là m'avait malgre tout bien aidé mais si
tu connais mieux je suis preneur.

Ensuite, pour son code d'insertion, il oublie de préciser qu'il est
indispensable de faire une transaction, sans quoi, tout peut être bousillé.


Oui c'est vrai, malheureusement les transactions ne sont pas
supportées par toute les DB et on est bien obligé de faire avec...

A+
Christophe


Avatar
loufoque
a dit le 16/09/2005 à 12:32:

Ah, bon, il est vrai que je n'ai pas passé de temps à comparer de
nombreux articles et celui là m'avait malgre tout bien aidé mais si
tu connais mieux je suis preneur.


Explication de l'auteur.
http://searchoracle.techtarget.com/tip/1,289483,sid13_gci537290,00.html


Oui c'est vrai, malheureusement les transactions ne sont pas
supportées par toute les DB et on est bien obligé de faire avec...


MyISAM de MySQL ne les supporte pas, c'est vrai, mais bon au pire on
peut verrouiller la table en écriture. Et puis y'a InnoDB.