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 :

une requête avec 2 count sur la même table


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 242
    Points : 94
    Points
    94
    Par défaut une requête avec 2 count sur la même table
    Bonjour,

    J'aimerai avoir vos conseils concernant une requête? Celle-ci doit me ressortir l'ensemble des titres consultés et le nombre de consultation pour chacun des types(1 ou 2)
    Les titres sont dans une table notice et les consultations dans une tables consultation avec ID_Notice en clé externe. On enregistre une ligne à chaque consultation avec l'id_de la notice et le type de consultation

    Ci dessous la requête que j'ai fait mais visiblement elle me renvoi un résultat faux, je pense que c'est le group by qui ne va pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT  n.Titre, COUNT(cf.ID_Notice), COUNT( c.ID_Notice)
    FROM notice n
    LEFT JOIN  consultation cf ON n.ID_Notice = cf.ID_Notice AND  cf.Type_Consult = 1
    LEFT JOIN  consultation c ON n.ID_Notice = c.ID_Notice AND  c.Type_Consult = 2
    WHERE cf.Date_Consult >= '2009-05-01' 
    AND cf.Date_Consult <= '2009-05-31'
    GROUP BY  cf.ID_Notice,c.ID_Notice
    merci par avance de votre aide

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Tiens, Saluton epeichette,

    Essaye comme ça
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT  n.Titre, COUNT(DISTINCT cf.ID_Notice), COUNT( DISTINCT c.ID_Notice)
    FROM notice n
    LEFT JOIN  consultation cf ON n.ID_Notice = cf.ID_Notice AND  cf.Type_Consult = 1
    LEFT JOIN  consultation c ON n.ID_Notice = c.ID_Notice AND  c.Type_Consult = 2
    WHERE cf.Date_Consult >= '2009-05-01' 
    AND cf.Date_Consult <= '2009-05-31'
    GROUP BY  cf.ID_Notice,c.ID_Notice
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Encore que n.Titre devrait probablement participer du GROUP BY ou ne pas figurer dans la requête puisque tu veux le résultat pour l'ensemble des titres
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  4. #4
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 242
    Points : 94
    Points
    94
    Par défaut
    dans ce cas, les counts ne me renvoies que des valeurs 0 ou 1 ce n'est pas du tout les bons résultats

  5. #5
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 242
    Points : 94
    Points
    94
    Par défaut
    non j'ai besoin du titre pour avec des reponses de ce type
    titre count type 1 count type2
    titre1 2 5
    titre2 25 0

  6. #6
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Et comme ça
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT COUNT(DISTINCT cf.ID_Notice) as eff_cf,
    COUNT( DISTINCT c.ID_Notice) as eff_c
    FROM notice n
    LEFT JOIN  consultation cf ON n.ID_Notice = cf.ID_Notice AND  cf.Type_Consult = 1
    LEFT JOIN  consultation c ON n.ID_Notice = c.ID_Notice AND  c.Type_Consult = 2
    WHERE cf.Date_Consult BETWEEN  '2009-05-01' AND '2009-05-31'
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  7. #7
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 242
    Points : 94
    Points
    94
    Par défaut
    avec cette dernière requête je vais avec le nombre total de notices consultées pour chacun des types de consultation mais pas le nombre de consultation par titre et par type...

    Par contre je garde le between ...

  8. #8
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Alors il faut faire deux sous-requêtes que l'on va mettre en UNION et que l'on va sommer par titre
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT  titre, sum( eff_cf) AS eff_cf, sume(eff_c) AS eff_c
    FROM
    (SELECT n.titre, COUNT(*) AS eff_cf, 0 AS eff_c
    FROM notice n
    LEFT JOIN consultation cf ON n.ID_Notice = cf.ID_Notice AND  cf.Type_Consult = 1
    WHERE cf.Date_Consult BETWEEN  '2009-05-01' AND '2009-05-31'
    GROUP BY n.titre
    UNION
    SELECT n2.titre, 0 AS AS eff_cf, COUNT(*) eff_c
    FROM notice n2
    LEFT JOIN consultation c ON n2.ID_Notice = c.ID_Notice AND  c.Type_Consult = 2
    WHERE c.Date_Consult BETWEEN  '2009-05-01' AND '2009-05-31'
    GROUP BY n2.titre)
    GROUP BY titre
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  9. #9
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 242
    Points : 94
    Points
    94
    Par défaut
    le requête que tu me proposes me renvoie une erreur mysql

    cette partie de requête est correcte
    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
     
     
    (SELECT n.titre, COUNT(*) AS eff_cf, 0 as eff_c
    FROM notice n
    LEFT JOIN consultation cf ON n.ID_Notice = cf.ID_Notice AND  cf.Type_Consult = 1
    WHERE cf.Date_Consult >= '2009-05-01' 
    AND cf.Date_Consult <= '2009-05-31'
    GROUP BY n.titre)
    UNION
    (SELECT n2.titre,  0 as eff_cf, COUNT(*) AS eff_c
    FROM notice n2
    LEFT JOIN consultation c ON n2.ID_Notice = c.ID_Notice AND  c.Type_Consult = 2
    WHERE  c.Date_Consult >= '2009-05-01' 
    AND c.Date_Consult <= '2009-05-31'
    GROUP BY n2.titre)
    j'obtiens un tableau avec le bon nombre de consultation par notice par contre quand une notice est consultés simultanément par les 2 types, il y a 2 ligne dons le resultat n'est pas encore correcte.
    Si je met le select du dessus comme tel

    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
     
    SELECT  titre, sum( eff_cf) , sum(eff_c)
    FROM
    (SELECT n.titre, COUNT(*) AS eff_cf, 0 as eff_c
    FROM notice n
    LEFT JOIN consultation cf ON n.ID_Notice = cf.ID_Notice AND  cf.Type_Consult = 1
    WHERE  
    AND cf.Date_Consult >= '2009-05-01' 
    AND cf.Date_Consult <= '2009-05-31'
    GROUP BY n.titre)
    UNION
    (SELECT n2.titre,  0 as eff_cf, COUNT(*) AS eff_c
    FROM notice n2
    LEFT JOIN consultation c ON n2.ID_Notice = c.ID_Notice AND  c.Type_Consult = 2
    WHERE  c.Date_Consult >= '2009-05-01' 
    AND c.Date_Consult <= '2009-05-31'
    GROUP BY n2.titre)
    GROUP BY titre
    j'obtiens une erreur sql
    #1248 - Every derived table must have its own alias
    je ne comprend pas...

  10. #10
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 242
    Points : 94
    Points
    94
    Par défaut
    voila, j'ai mon resultat
    visiblement il fallait rajouter un alias sur l'union

    voila la requête qui me donne un résultat
    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
     
    SELECT  titre, SUM(eff_cf) , SUM(eff_c)
    FROM
    ((SELECT titre as titre, COUNT(*) AS eff_cf, 0 as eff_c
    FROM notice n
    LEFT JOIN consultation cf ON n.ID_Notice = cf.ID_Notice AND  cf.Type_Consult = 1
    WHERE cf.Date_Consult >= '2009-05-01' 
    AND cf.Date_Consult <= '2009-05-31'
    GROUP BY n.titre)
    UNION
    (SELECT titre as titre,  0 as eff_cf, COUNT(*) AS eff_c
    FROM notice n2
    LEFT JOIN consultation c ON n2.ID_Notice = c.ID_Notice AND  c.Type_Consult = 2
    WHERE c.Date_Consult >= '2009-05-01' 
    AND c.Date_Consult <= '2009-05-31'
    GROUP BY n2.titre))
    AS TMP
    GROUP BY titre
    Merci bien pour votre aide

  11. #11
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Exact, mea maxima culpa, mais tu as trouvé toute seule comme une grande,
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  12. #12
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    En fait, je pense que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT n.Titre, COUNT(DISTINCT cf.ID_Notice), COUNT(DISTINCT c.ID_Notice)
    FROM notice n
    LEFT JOIN  consultation cf ON n.ID_Notice = cf.ID_Notice AND  cf.Type_Consult = 1
    LEFT JOIN  consultation c  ON n.ID_Notice = c.ID_Notice  AND  c.Type_Consult = 2
    WHERE cf.Date_Consult >= '2009-05-01' AND cf.Date_Consult <= '2009-05-31'
    GROUP BY n.Titre
    devrait suffire. Encore qu'en termes de performances il faut voir... je suppose que ça va dépendre de la cardinalité de la relation avec "consultation".

    La requête suppose que "ID_Notice" est la clef primaire de "consultation"... ce qui n'a pas l'aire d'être le cas, donc il faudra certainement la remplacer par la PK.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 24/09/2012, 23h12
  2. Réponses: 5
    Dernier message: 16/07/2010, 12h27
  3. Requête avec conditions multiples sur le même champ
    Par skerdreux dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/06/2008, 19h15
  4. Une requête avec un Max sur 2 champs
    Par Bils dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/09/2007, 14h04
  5. [SQL]Requete avec 2 count(*) sur la même table
    Par Sonny dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/11/2005, 16h41

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