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 sur plusieurs tables et une arborescence [MariaDB]


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2021
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Requête sur plusieurs tables et une arborescence
    Bonjour,

    Je suis en train de développer un outil pour mon travail et je dois à présent effectuer une requête sql pour récupérer mon arborescence.

    Je m'explique j'ai dans ma base de données plusieurs tables:

    Une table

    -projet qui contient le nom et les données globales de plusieurs projet.

    -AL qui represente un lien entre projet et niveau

    -niveau qui représente mon arborescence (un niveau peut avoir un ou plusieurs enfants)

    -article qui correspond est contenu dans un niveau

    projet:
    Nom : tableProjet.PNG
Affichages : 153
Taille : 5,5 Ko
    niveau:
    Nom : tableNiveau.PNG
Affichages : 166
Taille : 68,1 Ko
    al:
    Nom : tableALSQL.PNG
Affichages : 149
Taille : 8,1 Ko
    Pour l'instant j'ai fait cette requète:
    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
    20
    21
    22
    23
     
    SELECT * FROM article
                INNER JOIN
                niveau ON article.article_id = niveau.article_id
                INNER JOIN
                arborescence_logistique ON arborescence_logistique.niveau_id IN
    (WITH RECURSIVE tree (niveau, id)
        AS
        (SELECT niveau_id, parent_id
         FROM niveau N 
         UNION ALL
         SELECT niveau_id, parent_id
         FROM niveau V
         INNER JOIN
         tree t
         ON t.id = V.niveau_id)
        SELECT niveau
        FROM tree
        WHERE id IS NULL )
    INNER JOIN
                 projet
                 ON arborescence_logistique.projet_id = projet.projet_id
                 WHERE  projet.nom = :projet;
    Le soucis est que cette requète me renvoie même la ligne avec l'id 24 alors qu'elle n'est affecté à aucun projet?

    Ah et :projet = Mini projet test

    Je viens de remarquer un autre soucis aussi j'aimerai recevoir comme résultat de requète un tableau ordonné en fonction de mon arborescence.

    Donc le niveau mère tout en haut suivi du fils1 et de ses fils puis le fils 2 suivi de ses fils et etc or avec cette requète le résultat est trié par niveau_id.

    Exemple du tableau:
    Nom : tableAL.PNG
Affichages : 151
Taille : 85,9 Ko

    J'ai bien conscience qu'avec ce cours résumé il doit y avoir des tas de choses à clarifier donc n'hésitez pas à me demander les informations manquantes.

    Voilà j'attends avec impatience vos réponses et vous remercie dès à présent de toute aide que vous saurez m'apporter.

  2. #2
    Membre confirmé Avatar de isabelle.letrong
    Femme Profil pro
    Conseil - Consultante en systèmes d'information
    Inscrit en
    Juillet 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Conseil - Consultante en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2010
    Messages : 109
    Points : 487
    Points
    487
    Par défaut
    Bonjour,

    Pour gérer un arbre je vous conseille vivement d'envisager de le gérer par représentation intervallaire.
    Vous trouverez ici https://sqlpro.developpez.com/cours/arborescence/ une bonne présentation du concept.

    Je vous conseille vivement de gérer les mises à jour de l'arbre (insertion, suppression, update) via des procédures stockées.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2021
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonjour à vous,
    alors déjà sans vous offenser vous n'avez pas vraiment répondu à ma question.
    Et je m'étais effectivement penché sur cette représentation intervallaire mais elle n'ai (je ne pense pas) applicable dans mon cas ( je n'ai aucune idée de la profondeur de mon arborescence ni de sa taille (du nombre de branche).
    Cela peut aller de 2-3 branche et 2-3 niveau de profondeur pour certains projets à plusieurs dizaines.

    C'est donc pourquoi je cherchais à faire cette requête.

    Toutefois si vous auriez une solution faisable et plus facile avec la représentation intervallaire je suis preneur.

    Encore merci de votre réponse à bientôt.

  4. #4
    Membre confirmé Avatar de isabelle.letrong
    Femme Profil pro
    Conseil - Consultante en systèmes d'information
    Inscrit en
    Juillet 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Conseil - Consultante en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2010
    Messages : 109
    Points : 487
    Points
    487
    Par défaut
    Bonjour,

    Une représentation intervallaire gère un arbre à n niveaux sans limite de taille.
    La recherche avec une telle gestion est bien plus efficace que l'utilisation de requêtes récursives.

    Croyez moi cela fonctionne, je l'ai mis en œuvre à plusieurs reprises sur des arbres sans limite de profondeur et de taille...

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2021
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Mais une chose que je ne comprends pas si imaginons que je rajoute une valeur en plein milieu de mon arbre il faudrait modifier toutes les valeurs des bornes dans cette représentation non ?

    Est-il possible de le faire automatiquement?

    Imaginons:

    j'ai un noeuds baie qui contient 2 noeuds pc si je veux rajouter un noeud pc alors il faut que je modifie toutes mes bornes non ?

    EDIT: question stupide de ma part cela est bel et bien expliqué

  6. #6
    Membre confirmé Avatar de isabelle.letrong
    Femme Profil pro
    Conseil - Consultante en systèmes d'information
    Inscrit en
    Juillet 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Conseil - Consultante en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2010
    Messages : 109
    Points : 487
    Points
    487
    Par défaut
    Ma-nie
    Mais une chose que je ne comprends pas si imaginons que je rajoute une valeur en plein milieu de mon arbre il faudrait modifier toutes les valeurs des bornes dans cette représentation non ?
    Pas toutes les valeurs des bornes mais celles des éléments concernés de l'arbre .

    Dans la pratique (on suppose qu'on insère à droite) :
    (1) On localise le parent de l'élément à insérer. On suppose que $BG est le bord gauche du parent et $BD le bord droit du parent.
    (2) on fait bordDroit = bordDroit + 2 pour tous les éléments de l'arbre pour lesquels bordDroit est >= à $BD (en triant l'ordre des maj de manière descendante)
    (3) on fait bordGauche = bordGauche + 2 pour tous les éléments de l'arbre pour lesquels bordGauche est > à $BD (en triant l'ordre des maj de manière descendante)
    (4) on insert l'élément (BordGauche = $BD et BordDroit = $BD+1)

    Je conseille pour chaque élément de noter (via une clé étrangère) l'identifiant de son parent....

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2021
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Ah oui bon bin parfait merci à vous je vais voir ce que ça donne avec cette représentation!!

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    étant l'auteur de ces aticles sur le mode intervallaire je vais vous répondre :

    Citation Envoyé par Ma-nie Voir le message
    Mais une chose que je ne comprends pas si imaginons que je rajoute une valeur en plein milieu de mon arbre il faudrait modifier toutes les valeurs des bornes dans cette représentation non ?
    Non, mais en moyenne 50%


    Est-il possible de le faire automatiquement?
    Oui, par le biais de déclencheurs en conservant l'approche par auto référence


    Imaginons:

    j'ai un noeuds baie qui contient 2 noeuds pc si je veux rajouter un noeud pc alors il faut que je modifie toutes mes bornes non ?
    Non, mais en moyenne 50%...



    EDIT: question stupide de ma part cela est bel et bien expliqué
    OUI !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 04/02/2013, 14h24
  2. [AC-2003] Requête sur plusieurs tables dans une seule liste
    Par tarnx dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 04/12/2009, 11h36
  3. Question pour une requête sur plusieurs tables/objets
    Par pontus21 dans le forum Hibernate
    Réponses: 54
    Dernier message: 01/06/2009, 18h37
  4. Réponses: 2
    Dernier message: 12/01/2008, 14h57
  5. faire une requête sur plusieurs tables
    Par julien.63 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 16/08/2006, 22h58

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