IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Requête ardue avec un arbre intervallaire


Sujet :

Requêtes MySQL

  1. #1
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    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 :

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

    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 :

    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...

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    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 ?

  3. #3
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Bonjour, et d'abord merci de votre intérêt pour mon post.

    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...

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    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 ?

  5. #5
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    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à.

  6. #6
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    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 ?

  7. #7
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    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...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

Discussions similaires

  1. requêtes SQL avec les arbres algébrique
    Par amazircool dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/03/2007, 00h04
  2. [VB.NET] [ODBC] Pb requête UPDATE avec clé primaire..?
    Par Pleymo dans le forum Windows Forms
    Réponses: 7
    Dernier message: 09/03/2005, 18h46
  3. requête SQL avec paramètre en vb avec base de donnée SQL srv
    Par dialydany dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 01/02/2005, 10h33
  4. [Requête] Problème avec fonction "DATE_FORMAT()"
    Par sekiryou dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2005, 21h52
  5. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 11h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo