Faire un liste hiarchisé à partir d'une seule table = facile ?

cs_cuisine Messages postés 7 Date d'inscription mercredi 27 octobre 2004 Statut Membre Dernière intervention 19 septembre 2009 - 17 sept. 2009 à 19:12
cs_cuisine Messages postés 7 Date d'inscription mercredi 27 octobre 2004 Statut Membre Dernière intervention 19 septembre 2009 - 19 sept. 2009 à 21:19
Bonjour,

C'est la première fois que je demande de l'aide en php sur un forum. Je ne trouve pas de solution pour générer un liste "hiérarchisé".
J'ai une table en mySQL (une liste de matériel de théâtre). Sauf que tous les objets sont contenus dans un autre. En clair : chaque objet à un objet "conteneur". Sauf bien-sûr le tout premier qui est unique et contient donc tous les autres.

Ma table :
id | idconteneur | nom
1 | 0 | matériel
3 | 8 | gros pack
5 | 1 | lumières
8 | 5 | controleurs
etc.

Ce que je voudrais afficher :
matériel (cet "objet" contient tous les autres)
>lumières
>>controleurs
>>>gros pack
>>>>orgue à lumière
>>>>ralonge triphasé
>>>petit pack
>>>>gradateur 220v
>>projecteurs
>>>projecteur PAR
>>>projecteur PC
>son
>>gros pack
>>>haut parleur
etc .

J'ai l'intuition que ce ne doit pas être trop dur à faire mais je ne sais pas comment m'y prendre !

De l'aide serait bienvenue, merci d'avance !

12 réponses

nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
17 sept. 2009 à 20:46
Bonjour,

Non seulement facile mais un classique. Une recheche avec "recursive database table" va te fournir des dizaines de milliers d'implémentations, en à peu près tous le slangages de programmation, et pour tous les SGBD de la planète.

Dans t astucture d etable, l'insertion d'un champ 'parent_id' par exemple, qui référence la catégorie parente...
0
cs_cuisine Messages postés 7 Date d'inscription mercredi 27 octobre 2004 Statut Membre Dernière intervention 19 septembre 2009
17 sept. 2009 à 21:46
Merci j'essaye ça.
j'ai deja un "parent_id", je l'ai appellé 'idconteneur'.
0
cs_cuisine Messages postés 7 Date d'inscription mercredi 27 octobre 2004 Statut Membre Dernière intervention 19 septembre 2009
17 sept. 2009 à 22:34
Bon ma recherche n'a rien donnée de concret ca parle de plusieurs tables, or j'essaye de faire ça avec une seule table...
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
17 sept. 2009 à 22:46
Salut,

C'est sans doute qu'il est plus judicieux de faire cela en plusieurs tables.
En utilisant une seule table tu risques au final de complexifier grandement la chose.

Cordialement,

Kohntark -
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cuisine Messages postés 7 Date d'inscription mercredi 27 octobre 2004 Statut Membre Dernière intervention 19 septembre 2009
17 sept. 2009 à 23:14
Je tiens à le faire sur une seule table... et je suis sur que la solution est simplisime mais je suis trop débutant pour la trouver :(
0
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
18 sept. 2009 à 00:02
Si ta table n'est pas trop grosse (pa splus de 5 à 6000 entrées), une solution simple consiste à lire depuis un objet PDO dans une boucle foreach et alimenter un tabeau avec...

Là ça devient très simple à mettre en oeuvre.
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
18 sept. 2009 à 00:46
Comme d'hab je peux me tromper mais si j'ai bien compris tu as des catégories, des sous catégories, des sous sous catégories, des sous sous sous catégories. Je vois mal comment tu peux arriver à tes fins sans modifier la structure de ta table, à défaut d'en créer plusieurs.
Pense également que demain (peut être) tes enregistrements doublerons, tu implémentera un moteur de recherche, de l'ajax, des stats, ... Limiter aujourd'hui à une table te rendra tout cela impossible demain.

Cordialement,



Kohntark -
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
18 sept. 2009 à 08:34
Tiens, pour une fois, je ne suis pas d'accord avec toi Kohntark. LOL !! Dans le cadre professionnel je gère une seule table de 10 000 personnes avec une relation de manager-managé et j'ai une fonction récursive.. jusqu'au big boss.
Dommage que j'ai pas le temps sinon j'irai rechercher le code pour 'cuisine'.. désolé.
S.
0
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
18 sept. 2009 à 11:09
Syndrael

Moi aussi j'ai plusieurs projets pour mes clients, en gestion récursive.
Le recherche par arbre est excellente une fois maîtrisée, et de plus très souple et rapide.

C'est une vieille légende tenace qui veut que le récursif soit lourd sur les SGBD :)
0
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
18 sept. 2009 à 11:10
Je mettrai le code d'une classe PHP demain, le temps de la ressortir des archives...
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
18 sept. 2009 à 20:29
Vous avez raison. A vrai dire je n'ai même pas pensé aux arbres de recherche lors de ma réponse tardive (faut vraiment que je me couche plus tôt)
Ca n'empêche que j'ai toujours eu du mal avec les arbres (même en me couchant tôt) et je ne serai pas de bon conseil là dessus. J'ai d'ailleurs tenté d'en mettre un en place (Btree) il y a peu ... ça m'a tellement gavé que j'ai abandonné
va falloir que je bosse ça.

Bonne soirée à vous,


Kohntark -

NB : merci d'avance pour la classe Nautilus, ça me permettra, moyennant un peu de motivation, de comparer avec ce que j'avais fait.
0
cs_cuisine Messages postés 7 Date d'inscription mercredi 27 octobre 2004 Statut Membre Dernière intervention 19 septembre 2009
19 sept. 2009 à 21:19
Bonjour,

Bon finalement je me suis bricolé seul un truc. Ca fait bcp de requêtes mais je sais qu'il n'y aura pas tellement de niveaux différents ni tellement de matériel de spectacle à rentré dans cette table alors ça passera :).

Je ne suis pas pro, je fait ça en hobby pour une asso de théâtre.

Voilà en gros la fonction :

function enfants($num,$idparent)
{
// on cherche les enfants d'un parent précis
$query[$num] = mysql_query('SELECT id,idparent,nom FROM g_materiel WHERE idparent='. $idparent .' ORDER BY nom');

// puis on liste les enfants (si il y en a)
if (mysql_num_rows($query[$num]) > 0) // on liste que si des enfants existent
{
while ($ret[$num] = mysql_fetch_array($query[$num],MYSQL_ASSOC))
{
for ($i=1;$i<$num;$i++){echo '| · · · ';} // on rajoute devant un ecarteur, une sorte de puce quoi
echo $ret[$num]['nom'];

// on relance une boucle dedans
enfants($num + 1,$ret[$num]['id']);
}
}
}



ça donne un truc du genre :

alexandre
| - gregory
| - - sophie
| - - - karine
| - david
| - - thierry
| - - gerald
| - franck

Voilà !

Allez-y jetez moi des pierres ;)
0
Rejoignez-nous