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 :

requete devant ramener des enregistrements vides


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 94
    Points : 120
    Points
    120
    Par défaut requete devant ramener des enregistrements vides
    Bonjour,

    J'ai une base comportant 2 tables, la première étant l'arbre des catégories et la seconde les matériels présent dans cette catégorie.

    Je cherche à faire une requète me ramenant le nom de la catégorie racine (sans parent) et le nombre de matériels présent dans ses branches, et ce même si aucun matériel n'est présent (donc je dois récupérer 0).

    Information complémentaire: aucun matériel ne dépend directement d'une racine, toujours d'une branche.

    A l'heure actuelle, j'arrive à cette requète:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT catprinc.id, catprinc.nom, COUNT(*)
    FROM materiels, categories souscat, categories catprinc
    WHERE materiels.pid = souscat.id
    AND souscat.pid = catprinc.id
    AND catprinc.pid = 0
    GROUP BY catprinc.id
    Le problème de cette requète est qu'elle ne me ramène pas les racines qui ne comporte aucun matériel.

    Si quelqu'un pouvait m'aider, ce serait sympa. Je présume qu'il faut utiliser une jointure mais je n'arrive pas à les comprendre parfaitement. D'ailleurs, n'hésitez pas à me mettre l'explication avec votre solution (ou début de solution).

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    C'est parce que tu n'utilises pas les bonnes jointures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT CP.id, CP.nom, COUNT(DISTINCT M.id)
    FROM categories CP
       LEFT JOIN categories SC
           ON CP.id = SC.pid
          LEFT JOIN materiels M
              ON SC.id = M.pid
    WHERE CP.pid = 0
    GROUP BY CP.id
    au fait, au passage, tu devrais utiliser NULL plutôt que 0 pour categories.pid quand il n'y a pas de catégorie parent

    pour plus d'informations sur les jointures, regarde le lien dans ma signature

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 94
    Points : 120
    Points
    120
    Par défaut
    Merci, tu as sauvé ma vie...
    je vais vite filer voir le lien dans ta signature

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 94
    Points : 120
    Points
    120
    Par défaut
    J'ai encore un problème avec cette requète: comme elle sert à parcourir un arbre, je veux qu'elle puisse fonctionner lorsqu'on est dans une sous-catégorie.
    Si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -- $actuel = id de la (sous)catégorie où nous sommes
    --
     
    SELECT CP.id, CP.nom, COUNT(DISTINCT M.id)
    FROM categories CP
       LEFT JOIN categories SC
           ON CP.id = SC.pid
          LEFT JOIN materiels M
              ON SC.id = M.pid
    WHERE CP.pid = $actuel
    GROUP BY CP.id
    tout marche très bien.
    Le problème est que lorsque je ne suis pas à la racine (donc $actuel = 0), je ne connais pas l'id de la catégorie mais son nom.

    Malgré de multiples essais et tatonnements, je ne vois pas le moyen de faire la corrélation entre le champ CP.cat_name (donc celui que j'ai) et CP.id

    Je pourrais bien sûr faire ça avec 2 requètes mais je suis certain que c'est possible en une seule

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

Discussions similaires

  1. Exclure des enregistrements vide dans une requête sql
    Par beegees dans le forum Langage SQL
    Réponses: 1
    Dernier message: 31/03/2009, 19h42
  2. requete de selection des chambres vide
    Par ikramta dans le forum Requêtes
    Réponses: 5
    Dernier message: 26/02/2009, 15h50
  3. Requetes portant sur des champs vides
    Par Pucho dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 18/10/2007, 21h44
  4. Requete Access : Trier des enregistrements
    Par Fly3R dans le forum VB.NET
    Réponses: 3
    Dernier message: 24/09/2007, 01h45
  5. Réponses: 7
    Dernier message: 21/04/2004, 17h16

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