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 :

Requête sur une table parent et 2 tables enfants


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 8
    Points
    8
    Par défaut Requête sur une table parent et 2 tables enfants
    Bonjour,

    Voilà : j'ai une table "Parent" et 2 tables "Enfant"

    J'aurais voulu, avec une seule requête, retrouver tous les champs de la table parent et le nombre d'enregistrements de chacune des tables enfants ayant une correspondance dans la table parent.

    Par ex, pour une bibliothèque, j'ai une table "Livres", une table "Livres_Ramenés" et une table "Livres_Empruntés"
    Pour chaque livre de la table "Livres", je voudrais savoir pour un jour donné, combien ont été ramenés et combien ont été empruntés.

    La requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Livres.ID, Livres.Titre, 
    COUNT(Empruntes.Livre_ID) As Nb_Empruntes, 
    COUNT(Ramenes.Livre_ID) As Nb_Ramenes
    FROM (Livres LEFT JOIN Empruntes ON Livres.ID = Empruntes.Livre_ID) LEFT JOIN Ramenes on Livres.ID = Ramenes.Livre_ID)
    Group by Livres.ID, Livres.Titre
    me renvoie, pour un enregistrement, la même valeur dans les champs Nb_Empruntes et NB_Ramenes, a savoir le produit des 2 quantités qu'il aurait dû trouver...

    (Avec moteur Jet / Access)

    Si quelqu'un a une idée, ce serait avec joie.

    Merci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il faut faut mettre des distincts dans vos compteurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT
        Livres.ID,
        Livres.Titre, 
        COUNT(DISTINCT Empruntes.Livre_ID) As Nb_Empruntes, 
        COUNT(DISTINCT Ramenes.Livre_ID) As Nb_Ramenes
    FROM
        Livres
        LEFT JOIN Empruntes
          ON Empruntes.Livre_ID = Livres.ID
        LEFT JOIN Ramenes
          ON Ramenes.Livre_ID = Livres.ID
    GROUP BY
        Livres.ID,
        Livres.Titre

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Merci de votre réponse.

    En essayant DISTINCT dans la fonction COUNT, je reçois le message :

    Erreur de syntaxe (opérateur absent) dans l'expression 'COUNT(DISTINCT Empruntes.Livres_ID)'

    Par contre j'ai résolu le pb en imbriquant des SELECT :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      SELECT Livres.*,
      (SELECT COUNT(Empruntes.Livre_ID) FROM Empruntes 
           Where Livres.ID = Empruntes.Livre_ID) AS Nb_Empruntes, 
       (SELECT COUNT(Ramenes.Livre_ID) FROM Ramenes 
           Where Livres.ID = Ramenes.Livre_ID) AS Nb_Ramenes
      FROM Livres
      ORDER By Livres.ID

    Et ça marche nickel. (En VB, avec le moteur Jet / Access)

    J'ai lu quelque part que les SELECT imbriqués ne marchaient pas avec Mysql, mais cette info n'était pas datée. Peut-être que la dernière version le permet ?

    En tout cas merci de vous être penché sur mon problème.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il y a peut-être des parenthèses alors COUNT(DISTINCT(ID)), la syntaxe varie avec les SGBD.

    Votre requête fonctionne effectivement, mais je ne suis pas fan ce ces écritures.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Il y a peut-être des parenthèses alors...
    Ce n'était pas testé ?

    Citation Envoyé par Waldar Voir le message
    ... la syntaxe varie avec les SGBD.
    En SQL et quelque soit le SGBD, DISTINCT est un mot clé, non une fonction. Ca ne marche donc pas mieux avec des parenthèses.

    Citation Envoyé par Waldar Voir le message
    Votre requête fonctionne effectivement, mais je ne suis pas fan ce ces écritures.
    Avez-vous une solution qui fonctionne dont l'écriture vous conviendrait mieux ?

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par DocDen Voir le message
    Ce n'était pas testé ?
    Access est probablement un des seul SGBD (si on peut appeller cet outil un SGBD) à ne pas connaître count(distinct), j'ai googlé cette information que j'ignorais.

    Il va falloir vous cantonner à votre requête, mais si vous êtes sous Access vous ne devez pas gérer de très grosses volumétries.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Access est un pis-aller pour l'instant. (je prend le train en marche et le changement de BdD n'est pas à l'ordre du jour)

    La plus grosse table avoisine les 7 000 enregistrements, ce qui n'est pas une grosse volumétrie pour un vrai SGBDR mais commence à être honorable pour Access.

    J'ai l'espoir de faire migrer un jour ces données vers un vrai SGBDR Je devrais donc passer par une phase d'optimisation des requêtes...

    En tout cas merci pour le coun(distinct) que je ne connaissait pas et qui me servira certainement pour me frotter à des BdD plus conséquentes.

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

Discussions similaires

  1. Récupération du résultat d'une requête sur une table liée
    Par champijulie dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 05/06/2007, 12h26
  2. Effectuer une requête sur une table.
    Par Premium dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/05/2007, 16h27
  3. Recupérer le résultat d'une requête sur une table Firebird
    Par defluc dans le forum Bases de données
    Réponses: 7
    Dernier message: 20/04/2007, 18h30
  4. Réponses: 5
    Dernier message: 08/01/2007, 21h03
  5. requéte sur une table
    Par iutcien dans le forum Langage SQL
    Réponses: 1
    Dernier message: 23/06/2006, 15h42

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