Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requête avec agrégat (?)

Mysql

Sujet résolu
    19 mai 2011 à 16:54:02

    Bonjour,

    J'ai les 3 tables suivantes :

    1) la table "livre" ( id_livre , titre )
    2) la table "lecteur" ( id_lecteur , nom_lecteur )
    3) la table de jointure "lit" ( id_lecteur , id_livre )

    Pour obtenir le nombre de livres lus par chaque lecteur, je fais la requête suivante :

    SELECT R.NOM_LECTEUR,R.ID_LECTEUR,
    
    COUNT(L.id_livre)AS stat_lecteurs
    	
    FROM LIVRE L
    	 
    INNER JOIN LIT ON LIT.ID_LIVRE = L.ID_LIVRE
    INNER JOIN LECTEUR R ON R.ID_LECTEUR = LIT.ID_LECTEUR
    
    GROUP BY R.NOM_LECTEUR
    


    J'obtiens un résultat du style :

    NOM_LECTEUR, ID_LECTEUR, stat_lecteurs
    "Aucun lecteur", 3, 684
    "Lecteur A", 2, 19
    "Lecteur B", 1, 795

    Cela fonctionne. Mais comment gérer en plus le cas suivant : un même livre peut avoir été lu par le lecteur A et par le lecteur B. Ce qui dans la table "lit" se traduit comme cela :

    id_lecteur , id_livre
    1 (id lecteur A), 10
    2 (id lecteur B), 10

    Ma requête peut-elle être adaptée pour me retourner aussi le nombre de mêmes livres lus par le lecteur A et le lecteur B ? Oui dois-je forcément modifier ma table lecteur et lit (en créant une entité lecteur "lecteur A et B") ?
    Merci.



    • Partager sur Facebook
    • Partager sur Twitter
      19 mai 2011 à 21:04:45

      Euh je ne suis pas certain d'avoir bien saisie le sens de ta question.
      Toujours est-il que dans ta requête tu prends la table livre ce qui ne te sert à rien vu le résultat que tu veux obtenir.
      SELECT R.NOM_LECTEUR,R.ID_LECTEUR,COUNT(L.id_livre) stat_lecteurs
      FROM LIT L
      INNER JOIN LECTEUR R ON R.ID_LECTEUR = L.ID_LECTEUR
      GROUP BY R.ID_LECTEUR, R.NOM_LECTEUR
      
      • Partager sur Facebook
      • Partager sur Twitter
        19 mai 2011 à 23:11:41

        C'est pas un LEFT JOIN donc L.id_livre n'est jamais NULL, donc tu peux aussi remplacer count(L.id_livre) par count(*).

        SELECT R.NOM_LECTEUR, R.ID_LECTEUR, COUNT(*) stat_lecteurs
        FROM LIT L JOIN LECTEUR R USING(ID_LECTEUR)
        GROUP BY R.ID_LECTEUR, R.NOM_LECTEUR
        
        </citation>

        Dans le GROUP BY si tu ne mets que R.NOM_LECTEUR qui n'est pas unique, attention aux surprises...

        > Ma requête peut-elle être adaptée pour me retourner aussi le nombre de mêmes livres lus par le lecteur A et le lecteur B ?

        "adaptée", non...

        > Oui dois-je forcément modifier ma table lecteur et lit (en créant une entité lecteur "lecteur A et B") ?

        non, tu as déjà toutes les informations dont tu as besoin dedans

        il y a une foultitude d'options, notamment (avec $1 et $2 les ids des 2 lecteurs) :

        SELECT id_livre FROM lit WHERE id_lecteur = $1
        INTERSECT
        SELECT id_livre FROM lit WHERE id_lecteur = $2;
        
        
        SELECT id_livre 
        FROM lit a JOIN lit b USING (id_livre)
        WHERE a.id_lecteur = $1 AND b.id_lecteur = $2;
        
        
        SELECT id_livre 
        FROM lit
        WHERE id_lecteur IN ($1,$2)
        GROUP BY id_livre
        HAVING count(*) = 2
        


        (la dernière suppose que (id_lecteur,id_livre) est clé primaire de lit ou au minimum unique)
        • Partager sur Facebook
        • Partager sur Twitter
          20 mai 2011 à 21:12:31

          Merci beaucoup pour tous ces éléments de réponse constructifs :)
          • Partager sur Facebook
          • Partager sur Twitter

          Requête avec agrégat (?)

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown