Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/04/2011, 09h38   #1
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Par défaut Requête ardue avec un arbre intervallaire

Bonjour à tous et toutes,

Si vous ne connaissez pas la gestion d'arbre par représentation intervallaire, ne vous embêtez pas avec ce post.
http://sqlpro.developpez.com/cours/arborescence/

Mais ceux qui maîtrisent cet excellent système et qui ont lu le non moins excellent article de Frédéric Brouard, peuvent peut-être m'apporter leurs lumières.

Je construis une FAQ avec des catégories qui peuvent avoir autant de sous catégories que ce que désire le user. D'où l'emploi de la méthode intervallaire.

Mais, cerise sur le gâteau, je veux permettre au user d'ordonner les catégories, que ce soit les parents (par rapport aux autres parents) ou les filles (par rapport aux autres filles sous leur parent).

Voici la table exemple des catégories de FAQ :



J'ai donc ajouté une colonne "poids".
Les catégories parent sont repérables puisque id_pere est à 0.
Prenons l'exemple de la catégorie "Navigation" (id 2) : elle a les enfants 3 et 4 et on voit que 3 a lui-même deux enfants : 12 et 13. Ok.

Maintenant regardons l'ordre (poids) :
La catégorie 2 est la 3ème des catégories parents : ça roule.
La 4 est le 1er de ses 2 enfants et la 3 le 2ème.
La 13 est le 1er enfant de la 3 et la 12 le 2ème.

Tout cela est bien joli, mais je coince sur l'affichage final des catégories :

Voici les requêtes :

Code :
1
2
3
4
5
6
7
 
$sql = mysql_query("SELECT * FROM faq_cat where id != '1' AND id_pere = '0' ORDER BY poids"); // ramasse les parents
 
while($row = mysql_fetch_assoc($sql)){
$sc = mysql_query("SELECT * FROM faq_cat WHERE lft > '".$row['lft']."' AND rgt < '".$row['rgt']."' ORDER BY lft,poids");
//ramasse tous les enfants de chaque parent
}
Le problème c'est le ORDER BY. Si je fais BY lft (bord gauche), j'affiche bien les enfants groupés sous leurs parents (c'est le but), mais le poids est ignoré et j'obtiens :

Citation:
Navigation dans les articles
Avec Firefox
Avec Internet Explorer
Navigation dans le plan du site
Si je fais BY poids, ça va pas non plus, les enfants de la 3 sont ventilés, ce qui est logique :

Citation:
Navigation dans le plan du site
Avec Internet Explorer
Navigation dans les articles
Avec Firefox
Et si je fais, comme ici, BY lft, poids :

Citation:
Navigation dans les articles
Avec Firefox
Avec Internet Explorer
Navigation dans le plan du site
C'est idem que le 1 : la hiérarchie n'est plus respectée.
Alors ma question est : comment je peux organiser tout ça pour obtenir, dans ce cas :

Citation:
Navigation dans le plan du site
Navigation dans les articles
Avec Internet Explorer
Avec Firefox
Je peux ajouter des colonnes, créer d'autres tables, modifier la gestion des poids...mais je ne trouve pas l'algo de requête de recherche.

Voila. Je ne m'attends pas à ce que ce post reçoive beaucoup de réponses, mais si un pro des arbres intervallaires passe par là, et bien je le remercie de s'arrêter un moment...
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 09h50   #2
Membre Expert
 
Inscription : mars 2005
Messages : 1 565
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2005
Messages : 1 565
Points : 2 178
Points : 2 178
A première vue, je dirais qu'il faut que vous teniez compte du poids pour la valorisation de vos bornes gauche/droite de manière à ce qu'elle respectent l'ordre donné par le poids en plus de celui dicté par la relation de filiation.

Ca vous inspire ?
vmolines est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 10h05   #3
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Bonjour, et d'abord merci de votre intérêt pour mon post.

Citation:
A première vue, je dirais qu'il faut que vous teniez compte du poids pour la valorisation de vos bornes gauche/droite de manière à ce qu'elle respectent l'ordre donné par le poids en plus de celui dicté par la relation de filiation.

Ca vous inspire ?
Euh...
Vous voulez dire qu'il faudrait updater les bornes en même temps qu'on détermine les poids ? J'ai peur que cela crée un décalage et un sac de noeuds avec les autres catégories...
Ou alors tenir compte du poids déjà en place pour l'insertion de nouvelles catégories ? Ca me paraît difficile vu que le user peut créer des dizaines de catégories et ensuite, les ordonner. Ce sont deux opérations distinctes dans l'appli...
Mais c'est peut-être là que le bât blesse...

Je me demandais si je pourrais pas récolter les données dans un tableau PHP et ensuite le réordonner...mais ça c'est pas gagné non plus...
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 10h18   #4
Membre Expert
 
Inscription : mars 2005
Messages : 1 565
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2005
Messages : 1 565
Points : 2 178
Points : 2 178
A chaque fois que vous :
. insérez un élément
. supprimez un élément
. modifiez la filiation d'un élément
. modifiez le poids d'un élément

Vous recalculez vos bornes.

C'est ce que vous faîtes déjà sans le paramètre poids. En quoi ce nouveau paramètre de poids à prendre en compte est plus problématique ?
vmolines est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 10h27   #5
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Oui, je recalcule les bornes à chaque manip des catégories.
Mais franco, je ne vois pas comment intégrer le paramètre poids à ce moment-là.
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 12h08   #6
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
J'ai beau retourner le truc dans tous les sens, je ne vois pas du tout comment intégrer la notion de poids aux bornes...
Du moins pour que le poids s'adapte au bornes...
Aurais-tu un exemple ?
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 01h02   #7
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
C'est pourquoi ce genre d'arbre n'est pas forcément si simple par rapport à une arborescence plus classique...

L'idée peut être de décrémenter/d'incrémenter le poids de tout les éléments de l'intervalle à partir de la valeur du poids de celle insérée/supprimée par un autre update ou le même si c'est possible...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h25.


 
 
 
 
Partenaires

Hébergement Web