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

Langage SQL Discussion :

[MySQL] Arborescence intervallaire et relation


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 13
    Points
    13
    Par défaut [MySQL] Arborescence intervallaire et relation
    Bonjour,

    Dans un site stockant des questionnaires à choix multiples, j'utilise la méthode des arborescences intervalaires pour représenter une arborescence de thème (ou catégorie si vous préférez). Une seconde table liste les questionnaires avec un champ idtheme_rel.

    La table qcm_theme est du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idtheme : titre : bornegauche : taille : niveau : idtheme_rel
    Je met à jour les valeurs des champs niveau, taille et bornegauche par l'intermédiaire d'une script PHP. La borne droite se calcule par bornegauche + taille.

    La table qcm_questionnaire est du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idquestionnaire : titre : idtheme_rel : ...
    J'arrive à faire une requete pour compter le nombre de fils directs ou arborescents d'un theme ainsi que le nombre de questionnaires directs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // Themes avec nombre de fils arborecents et directs :
    SELECT T1.*, IF(T1.taille<>1,COUNT(*),0) AS nombrefils_arbo, SUM(T1.idtheme=T2.idtheme_rel) AS nombrefils_direct 
    FROM qcm_theme AS T1 LEFT JOIN qcm_theme AS T2 ON T2.bornegauche>T1.bornegauche AND T2.bornegauche + T2.taille<T1.bornegauche + T1.taille 
    WHERE T1.visible=1 AND (T2.visible=1 OR T2.visible IS NULL) 
    GROUP BY T1.idtheme 
    ORDER BY `T1`.`bornegauche` ASC
     
    // Themes avec nombre de questionnaires directs :
    SELECT T1.*, SUM(IF(T2.visible=1,1,0)) AS nbrquestionnaire_direct
    FROM qcm_theme AS T1 LEFT JOIN qcm_questionnaire AS T2 ON T1.idtheme=T2.idtheme_rel
    WHERE T1.visible=1 AND (T2.visible=1 OR T2.visible IS NULL) GROUP BY T1.idtheme
    ORDER BY `T1`.`bornegauche` ASC
    Mon problème est de compter les questionnaires reliés à un thème de manière arborescente.
    Lorsque j'utilise le terme relation directe cela veut dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qcm_theme.idtheme=qcm_questionnaire.idtheme_rel
    Le terme relation arborescente prend en compte la récursivité dans l'arborescence.

    Voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Table qcm_theme simplifiée :
    idtheme : titre : bornegauche : taille : niveau : idtheme_rel
    1 : a : 1 : 5 : 1 : 0
    2 : a1 : 2 : 3 : 2 : 1
    3 : a11 : 3 : 1 : 3 : 2
     
    Table qcm_questionnaire simplifiée :
    idquestionnaire : titre : idtheme_rel
    1: b : 2
    2 : bb : 2
    3 : c : 3
    4 : cc : 3
     
    Dans ce cas je cherche à obtenir un tableau du style :
    idtheme : titre : nbquestionnaire_arbo : nbquestionnaire_direct
    1 : a : 4 : 0
    2 : a1 : 4 : 2
    3 : a11 : 2 : 2
    Merci d'avance pour votre aide.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    Ma question est-elle posée au bon endroit?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    Je crois avoir trouvé ma réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //Nombre de questionnaires en relation directe et arborescente :
    SELECT T1.*,
    SUM(T3.titre IS NOT NULL) AS nombrequestionnaire_arbo, SUM(T1.idtheme=T3.idtheme_rel) AS nombrequestionnaire_direct
    FROM qcm_theme AS T1 
    LEFT JOIN qcm_theme AS T2 ON (T2.bornegauche>=T1.bornegauche AND T2.bornegauche + T2.taille<=T1.bornegauche + T1.taille AND T1.visible=1 AND T2.visible=1) 
    LEFT JOIN qcm_questionnaire AS T3 ON (T3.idtheme_rel=T2.idtheme AND T3.visible=1)
    GROUP BY T1.idtheme 
    ORDER BY `T1`.`bornegauche` ASC
    Les champs "visible" correspondent à un booléen de suppression logique dans mes tables.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 21/02/2011, 20h07
  2. Réponses: 3
    Dernier message: 26/10/2010, 13h58
  3. Arborescence intervallaire et concurrence
    Par Maverick_ch dans le forum Langage SQL
    Réponses: 1
    Dernier message: 06/04/2010, 23h50
  4. [phpMyAdmin] Exportation MySQL en gardant les relations
    Par lemirandais dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 12/02/2009, 10h29
  5. Gestion d'arborescence intervallaire
    Par booth dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/05/2006, 15h25

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