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 :

Problème avec COUNT


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 151
    Points : 154
    Points
    154
    Par défaut Problème avec COUNT
    Bonjour

    J'ai 3 tables: fiche (IdFiche, Nom, ...), passages (IdPassage, IdFiche, DatePassage, ...) et piecesjointes (IdPieceJointe, IdFiche, DateCre, ...).
    Je dois récupérer la liste des fiches n'ayant aucune pièce jointe ni aucun passage datant de moins de 18 mois.
    J'ai donc fait la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT COUNT(fe.IdFiche) AS NbFiches
    FROM fiche AS fe
    LEFT JOIN passages AS p ON fe.IdFiche = p.IdFiche AND p.DatePassage > NOW() - INTERVAL 18 MONTH
    LEFT JOIN piecesjointes AS pj ON fe.IdFiche = pj.IdFiche AND pj.DateCre > NOW() - INTERVAL 18 MONTH
    GROUP BY fe.IdFiche
    HAVING COUNT(IdPassage) = 0 AND COUNT(IdPieceJointe) = 0
    Le petit hic, c'est que au lieu de me renvoyer le nombre n d'éléments, il me renvoie n fois 1. Je sais qu'il me suffirait de compter le nombre de 1, mais je préfèrerais quand même récupérer directement la bonne valeur. Je sais pas vraiment comment résoudre le problème, sur le coup.

    PS: je travaille sur MySQL 5.0 en développement et MySQL 3.23 en production (pas le choix de la version, malheureusement)

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Il faut séparer les conditions de jointures des conditions de restrictions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT fe.IdFiche, fe.nom...
    FROM fiche AS fe
    LEFT JOIN passages AS p ON fe.IdFiche = p.IdFiche
    LEFT JOIN piecesjointes AS pj ON fe.IdFiche = pj.IdFiche
    WHERE p.DatePassage > NOW() - INTERVAL 18 MONTH
      AND pj.DateCre > NOW() - INTERVAL 18 MONTH
    GROUP BY fe.IdFiche
    HAVING COUNT(IdPassage) = 0 AND COUNT(IdPieceJointe) = 0

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 151
    Points : 154
    Points
    154
    Par défaut
    Mettre les conditions dans le where pose problème parce que justement, je ne veux que les fiches n'ayant pas de passage ou de pièce jointe dans les 18 derniers mois :
    Les mettre dans le where ne me gardera dans les résultats (après le where) que les fiches ayant des passages ou des pièces jointes dans les 18 derniers mois alors que ce sont justement celles que je veux éliminer (HAVING COUNT(...) = 0)

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Merci d'être clair sur votre besoin :
    Citation Envoyé par bigben89 Voir le message
    Je dois récupérer la liste des fiches n'ayant aucune pièce jointe ni aucun passage datant de moins de 18 mois
    est différent de :
    Citation Envoyé par bigben89 Voir le message
    je ne veux que les fiches n'ayant pas de passage ou de pièce jointe dans les 18 derniers mois
    Une fois ce point éclairci, vous pourrez essayer le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT fe.IdFiche, fe.nom...
    FROM fiche AS fe
    WHERE NOT EXISTS (SELECT 1 FROM passages AS p
                      WHERE p.IdFiche = fe.IdFiche
                      AND p.DatePassage > NOW() - INTERVAL 18 MONTH)
    AND NOT EXISTS (SELECT 1 FROM piecesjointes AS pj 
                    WHERE pj.IdFiche = fe.IdFiche
                    AND pj.DateCre > NOW() - INTERVAL 18 MONTH)

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Je viens de voir qu'en prod vous avez une version ancestrale.
    Je ne suis pas certain que la solution que je vous ai proposé fonctionnera.

    Vous pourrez essayer celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT fe.IdFiche, fe.nom...
    FROM fiche AS fe
    LEFT JOIN passages AS p ON fe.IdFiche = p.IdFiche
    LEFT JOIN piecesjointes AS pj ON fe.IdFiche = pj.IdFiche
    WHERE (p.DatePassage > NOW() - INTERVAL 18 MONTH OR p.IdFiche IS NULL)
    AND (pj.DateCre > NOW() - INTERVAL 18 MONTH OR pj.IdFiche IS NULL)

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 151
    Points : 154
    Points
    154
    Par défaut
    SELECT fe.IdFiche, fe.nom...
    FROM fiche AS fe
    LEFT JOIN passages AS p ON fe.IdFiche = p.IdFiche
    LEFT JOIN piecesjointes AS pj ON fe.IdFiche = pj.IdFiche
    WHERE (p.DatePassage > NOW() - INTERVAL 18 MONTH OR p.IdFiche IS NULL)
    AND (pj.DateCre > NOW() - INTERVAL 18 MONTH OR pj.IdFiche IS NULL)
    Le problème de cette requête, c'est qu'elle inclue les fiches ayant au moins un passage et une pièce jointe datant de plus de 18 mois, mais n'exclue pas celles ayant des passages ou pièces jointes plus récentes.
    Or chaque fiche pouvant avoir un bon nombre de passages/pièces jointes, il y en a pas mal qui en ont des 2 types.

    Merci d'être clair sur votre besoin : Citation:
    Envoyé par bigben89
    Je dois récupérer la liste des fiches n'ayant aucune pièce jointe ni aucun passage datant de moins de 18 mois

    est différent de : Citation:
    Envoyé par bigben89
    je ne veux que les fiches n'ayant pas de passage ou de pièce jointe dans les 18 derniers mois
    Je suis désolé, je m'explique peut-être pas forcément très clairement, mais je ne vois pas trop la différence entre les deux.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Citation Envoyé par bigben89 Voir le message
    Le problème de cette requête, c'est qu'elle inclue les fiches ayant au moins un passage et une pièce jointe datant de plus de 18 mois, mais n'exclue pas celles ayant des passages ou pièces jointes plus récentes.
    Et la requête avec le NOT EXISTS, que donne-t'elle ?

    Avec les jointures externes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT ...
    FROM fiche AS fe
        LEFT JOIN passages AS p
          ON fe.IdFiche = p.IdFiche
         AND p.DatePassage > NOW() - INTERVAL 18 MONTH
        LEFT JOIN piecesjointes AS pj
          ON fe.IdFiche = pj.IdFiche
         AND pj.DateCre > NOW() - INTERVAL 18 MONTH 
    WHERE
        p.IdFiche IS NULL
    AND pj.IdFiche IS NULL

    Je suis désolé, je m'explique peut-être pas forcément très clairement, mais je ne vois pas trop la différence entre les deux.
    En simple, dans la première phrase vous avez un ET, dans la seconde un OU.

Discussions similaires

  1. problème avec count
    Par tibss dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/04/2009, 15h44
  2. Problème avec COUNT
    Par knoodrake dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/04/2008, 09h56
  3. Problème avec COUNT() et la récupération des valeurs..
    Par Marshall_Mathers dans le forum Outils
    Réponses: 4
    Dernier message: 25/06/2007, 12h26
  4. Problème avec COUNT
    Par LhIaScZkTer dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/01/2006, 02h16
  5. Access/SQL : Problème avec Count
    Par Taurëndil dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/01/2005, 15h49

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