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

PHP & Base de données Discussion :

Afficher 0 dans les résultats count(*) [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2015
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Afficher 0 dans les résultats count(*)
    Bonjour

    voici ma requête , qui compte le nombre de clients dans chaque groupe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $req = $bdd->prepare('SELECT gl.name, c.id_default_group, count(*) as nb FROM prstshp_customer c LEFT JOIN prstshp_group_lang gl ON c.id_default_group=gl.id_group 
    		WHERE gl.id_lang=2 and MONTH(date_add)=:mois_aff and YEAR(date_add)=:annee 
    		GROUP BY c.id_default_group');
    		$req->bindValue(':mois_aff', $mois_aff);
    		$req->bindValue(':annee', $annee);
    		$req->execute();
    		while($row=$req->fetch(PDO::FETCH_OBJ)) {
    			echo '<tr><td>'.$row->name.'</td><td align="right">'.$row->nb.'</td></tr>';
    		}
    je souhaite afficher le zéro de count(*), car pour l'instant ca n'affiche que les groupes qui ont des clients

    Merci

  2. #2
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Il affiche quoi ? null au lieu de zéro ?
    Si c'est le cas, essaie ceci

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT gl.name, c.id_default_group, ifnull(0,count(*)) as nb
    FROM prstshp_customer c 
    LEFT JOIN prstshp_group_lang gl ON c.id_default_group=gl.id_group 
    WHERE gl.id_lang=2 
    and MONTH(date_add)=:mois_aff 
    and YEAR(date_add)=:annee 
    GROUP BY c.id_default_group
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2015
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Avec ta solution ca met des zeros de partout, ca ne fonctionne pas...

    Dans mon script je fais une boucle pour avoir des résultats sur plusieurs mois.
    Ca n'affiche pas Null ca ne met pas de ligne tout simplement.

    Janvier
    GP1 = 5
    GP2 = 4
    GP3 = 6

    Fevrier
    GP1=8
    GP2=3
    GP4=2
    GP5=7

    Mars
    GP3=5

    Avril
    GP2=5
    GP8=9


    J'aimerai afficher chaque groupe , et si 0 alors que ca m'affiche GP=0

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    tu ne peux pas afficher des lignes (ni le count) si elles sont exclus de ta requêtes, ou si elles n'existent pas dans la table !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		WHERE gl.id_lang=2 and MONTH(date_add)=:mois_aff and YEAR(date_add)=:annee
    Si, dans la table, tu n'as pas d'enregistrement en février pour le GP3 (par exemple), il n'y a aucune chance que ce soit comptabilisé dans la requête, puisque ça n'existe tout simplement pas.

    Si ce que tu veux c'est afficher TOUS les groupes (GP) pour tous les mois, il faut sans doute faire 2 requêtes.

    [EDIT] As-tu essayer de remplacer "LEFT JOIN" par "RIGHT JOIN" ou "FULL JOIN" ?
    Dernière modification par Invité ; 04/05/2016 à 18h45.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2015
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Oui en février je n'ai pas de client du groupe 3, le count devrait donc renvoyé 0 ?! GP3=0 ca me parait logique puisqu'il compte...

    Il y doit y avoir une autre solution que le faire en 2 requetes.

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 690
    Points : 20 211
    Points
    20 211
    Par défaut
    Et avec :
    à la place du count ?
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT gl.id_group,gl.name, count(*) as nb
    FROM prstshp_group_lang gl
    LEFT JOIN prstshp_customer c ON c.id_default_group=gl.id_group 
    WHERE gl.id_lang=2
    and MONTH(c.date_add)=2
    and YEAR(c.date_add)=2016 
    GROUP BY gl.id_group,gl.name
    ORDER BY gl.name
    Peux-tu essayer ceci, sous réserve que dans ta table gl, tous les groupes soient listés, qu'il y ait des clients ou non, et sous réserves qu'1 id groupe = 1 nom de groupe...

    Il me semblerait alors plus logique d'attaquer par ta table centrale.
    Par ailleurs, un group by doit lister tous les champs qui concernent l'agrégation, et name est un champ agrégatif.
    Le groupe G3 devrait t'afficher 0, s'il existe dans la table prstshp_group_lang.
    Par ailleurs, je présume que date_add est un champ de la table customer ? me trompai-je ? alors il vaut mieux le préfixer si c'est le cas.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2015
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    @Dendrite

    Oui date_add est un champ de la table customer.
    Voila le resultat de ta requete, j'ai pourtant une vingtaine de groupe, mais les groupe à 0 ne s'affichent toujours pas ...

    id_group name nb
    3 G3 156
    1 G1 81
    13 G13 66
    14 G14 77
    15 G15 10

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2015
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    @grunk

    Sans succès. Ça ne change rien

  10. #10
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Essaie ceci alors.
    date_add ne doit pas être dans le filtre général, mais dans la jointure facultative...

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT gl.id_group,gl.name, count(*) as nb
    FROM prstshp_group_lang gl
    LEFT JOIN prstshp_customer c ON c.id_default_group=gl.id_group and MONTH(c.date_add)=2 and YEAR(c.date_add)=2016 
    WHERE gl.id_lang=2
    GROUP BY gl.id_group,gl.name
    ORDER BY gl.name
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2015
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Ca marché à moitié ...

    ca cite bien tous les groupes mais quand ca devrait être 0 ça compte 1

    id_group name nb
    12 g12 1
    17 g11 1
    11 g11 1
    3 g3 156
    2 g2 1
    1 g1 81
    22 g22 1
    13 g13 77
    ....


    Je n'ai plus le temps de chercher je vais procéder autrement. merci quand même

  12. #12
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour

    Pas un count(*) mais la colonne que tu veux compter
    Exemple:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT gl.id_group,gl.name, count(c.id_default_group) as nb
    FROM prstshp_group_lang gl
    LEFT JOIN prstshp_customer c ON c.id_default_group=gl.id_group and MONTH(c.date_add)=2 and YEAR(c.date_add)=2016 
    WHERE gl.id_lang=2
    GROUP BY gl.id_group,gl.name
    ORDER BY gl.name

    A+.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2015
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    MERCI ! ça fonctionne !

    Mais lorsque j'ajoute une petite condition supplémentaire j'ai encore des problèmes.
    Je souhaite exclure du comptage le clients dont le code postal=X.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT gl.id_group,gl.name, count(c.id_default_group) as nb
    							FROM prstshp_group_lang gl
    							LEFT JOIN prstshp_customer c ON c.id_default_group=gl.id_group and MONTH(c.date_add)=4 and YEAR(c.date_add)=2016 
    							LEFT JOIN prstshp_address a ON c.id_customer = a.id_customer 
    							WHERE gl.id_lang=2 AND a.postcode <> 'X'
    							GROUP BY gl.id_group,gl.name
    							ORDER BY gl.name

    Dans ces cas là, les groupes à 0 disparaissent et mon groupe G15 renvoi 22 (ce qui est le bon nombre)

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT gl.id_group,gl.name, count(c.id_default_group) as nb
    							FROM prstshp_group_lang gl
    							LEFT JOIN prstshp_customer c ON c.id_default_group=gl.id_group and MONTH(c.date_add)=4 and YEAR(c.date_add)=2016 
    							LEFT JOIN prstshp_address a ON c.id_customer = a.id_customer AND a.postcode <> 'X'
    							WHERE gl.id_lang=2 
    							GROUP BY gl.id_group,gl.name
    							ORDER BY gl.name

    Dans ces cas là, les 0 s'affichent bien mais mon groupe G15 renvoi 24 alors qu'il devrait renvoyer 22. ( la condition sur le code postal n'est pas pris compte)

  14. #14
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Re,

    Vérifie bien la jointure que tu dois utiliser ici
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    LEFT JOIN prstshp_address a
    A+.

  15. #15
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2015
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Oui c'est bien ce que j'ai mis, ma jointure est bonne ... puisque dans ma premiere requete le nombre du G15 est bien 22.

  16. #16
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT gl.id_group,gl.name, count(distinct c.id_customer) as nb
    FROM prstshp_group_lang gl
    	LEFT JOIN prstshp_customer c ON c.id_default_group=gl.id_group and MONTH(c.date_add)=4 and YEAR(c.date_add)=2016 
    	LEFT JOIN prstshp_address a ON c.id_customer = a.id_customer AND a.postcode <> 'X'
    WHERE gl.id_lang=2 
    GROUP BY gl.id_group,gl.name
    ORDER BY gl.name
    Sinon, montre nous la structure des tables.

  17. #17
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2015
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    C'est une BDD prestashop 1.6 http://doc.prestashop.com/download/a...7693000&api=v2


    La requete

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT gl.id_group, gl.name, count( DISTINCT c.id_customer ) AS nb
    FROM prstshp_group_lang gl
    LEFT JOIN prstshp_customer c ON c.id_default_group = gl.id_group
    AND MONTH( c.date_add ) =4
    AND YEAR( c.date_add ) =2016
    LEFT JOIN prstshp_address a ON c.id_customer = a.id_customer
    AND a.postcode =75001
    WHERE gl.id_lang =2
    GROUP BY gl.id_group, gl.name
    ORDER BY gl.name

    affiche toujours autant de résultat ce qui prouve que peu importe ce que je met dans a.postcode , ce n'est pas pris en compte. Par contre si je fais ca :



    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT gl.id_group, gl.name, count( DISTINCT c.id_customer ) AS nb
    FROM prstshp_group_lang gl
    LEFT JOIN prstshp_customer c ON c.id_default_group = gl.id_group
    AND MONTH( c.date_add ) =4
    AND YEAR( c.date_add ) =2016
    LEFT JOIN prstshp_address a ON c.id_customer = a.id_customer
     
    WHERE gl.id_lang =2 AND a.postcode =75001
    GROUP BY gl.id_group, gl.name
    ORDER BY gl.name

    là c'est pris en compte mais tous les groupe à zero n'apparaissent plus.

  18. #18
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Citation Envoyé par BonCev Voir le message
    affiche toujours autant de résultat ce qui prouve que peu importe ce que je met dans a.postcode , ce n'est pas pris en compte.
    Parce que tu utilises un LEFT JOIN dans
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    LEFT JOIN prstshp_address a ON c.id_customer = a.id_customer AND a.postcode =75001
    Essaies avec
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    JOIN prstshp_address a ON c.id_customer = a.id_customer AND a.postcode =75001

    A+.

  19. #19
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Là à mon avis, il s'agit d'une jointure imbriquée.

    Essaie ceci
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT gl.id_group,gl.name,count( DISTINCT c.id_customer ) AS nb
    FROM prstshp_group_lang gl
    LEFT JOIN prstshp_customer c 
       inner JOIN prstshp_address a ON c.id_customer = a.id_customer AND a.postcode <> 'X'
    ON c.id_default_group=gl.id_group and MONTH(c.date_add)=2 and YEAR(c.date_add)=2016 
    WHERE gl.id_lang=2
    GROUP BY gl.id_group,gl.name
    ORDER BY gl.name
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  20. #20
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2015
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    aléluia

    la solution de seulement mettre join n'a pas l'air fructueuse, mais avec inner join ca fonctionne !

    Merci à vous tous

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Supprimer le double backslash dans les résultats SQL
    Par stephane.julien dans le forum C#
    Réponses: 12
    Dernier message: 24/09/2007, 11h53
  2. Ne pas obtenir de doublons dans les résultats.
    Par Premium dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 26/06/2007, 15h58
  3. Réponses: 4
    Dernier message: 12/11/2006, 19h49
  4. Aberration dans les résultat d'un SELECT
    Par tpatrice2003 dans le forum Oracle
    Réponses: 1
    Dernier message: 13/06/2006, 10h43
  5. Requête SELECT problème dans les résultats trouvés ...
    Par snoopy69 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/10/2005, 13h46

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