Problème avec COUNT et DISTINCT

Signaler
Messages postés
54
Date d'inscription
mercredi 4 mai 2005
Statut
Membre
Dernière intervention
10 septembre 2012
-
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
-
Bonjour,

Ca fait 2 jours que je cherche à compter le nombre d'éléments différents dans une colonne vide ('fact') et que mysql me sort 1 au lieu de 0.
J'ai essayé :

$nb1=mysql_fetch_array(mysql_query("SELECT COUNT(DISTINCT fact) FROM statut"));
echo '(nb1)'.$nb1['COUNT(DISTINCT fact)'];

$nb2=mysql_num_rows(mysql_query("SELECT DISTINCT fact FROM statut"));
echo '(nb2)'.$nb2;

$nb3=mysql_num_rows(mysql_query("SELECT DISTINCT fact FROM statut WHERE fact IS NOT NULL"));
echo '(nb3)'.$nb3;


Comment en fait en vrai ???

DapORoty
A voir également:

16 réponses

Messages postés
121
Date d'inscription
vendredi 31 mars 2006
Statut
Membre
Dernière intervention
30 décembre 2010

Salut,

Et comme ça :
SELECT count(*), fact FROM statut WHERE fact IS NOT NULL GROUP BY fact
Messages postés
54
Date d'inscription
mercredi 4 mai 2005
Statut
Membre
Dernière intervention
10 septembre 2012

Bonjour,

Depuis j'ai remplis quelques lignes dans ma colonne 'fact', ta requète me donne 3 éléments au lieu de 5 ...
J'ai jamais vu ca, ca me semblait pourtant simple

DapORoty
Messages postés
121
Date d'inscription
vendredi 31 mars 2006
Statut
Membre
Dernière intervention
30 décembre 2010

Re bonjour,

Je ne peux pas t'aider si tu ne me dis pas ce qu'il y a dans ta table.
Messages postés
54
Date d'inscription
mercredi 4 mai 2005
Statut
Membre
Dernière intervention
10 septembre 2012

Bonjour,
Actuellement j'ai dans ma table :

id fact
1 20100003
2 20100001
3 20100002
4 20100003
5 20100003
6
7
8 20100005
9 20100005
10 20100004
11 20100004

La en théorie je devrais avoir 5 éléments différents


DapORoty
Messages postés
121
Date d'inscription
vendredi 31 mars 2006
Statut
Membre
Dernière intervention
30 décembre 2010

J'ai testé en local : La requête que je t'ai donnée fonctionne bien...
Peux-tu vérifier le type de tes données ?
Messages postés
54
Date d'inscription
mercredi 4 mai 2005
Statut
Membre
Dernière intervention
10 septembre 2012

Les données 'fact' étaient en TEXT, je viens de les passer en INT.

$sql="SELECT count(*), fact FROM statut WHERE fact IS NOT NULL GROUP BY fact";
$rq=mysql_query($sql) or die(mysql_error());
$res=mysql_fetch_array($rq);
$nb=$res[0];
echo $nb;


J'ai extrait la rq précédente et mis sur une page seule pour éliminer d'éventuelles interactions.
Cette fois la requete me donne 1 au lieu de 5.



DapORoty
Messages postés
121
Date d'inscription
vendredi 31 mars 2006
Statut
Membre
Dernière intervention
30 décembre 2010

Non mais attend...
La requête fonctionne si tu l'exécute dans un client MySQL.

Par contre, ce qui ne marche pas c'est ta récupération des résultats en PHP. Je te conseille d'aller faire un tour ici :
http://php.net/manual/fr/function.mysql-fetch-array.php

Notamment la partie suivante :
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
printf("ID : %s Nom : %s", $row[0], $row[1]);
}
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
14
Salut,

Juste comme ça, chez moi ta première méthode fonctionne parfaitement :
$nb1=mysql_fetch_array(mysql_query("SELECT COUNT(DISTINCT fact) FROM statut"));
echo '(nb1)'.$nb1['COUNT(DISTINCT fact)'];

J'ai bien le bon nombre d'éléments distincts, aussi bien pour 0 que pour n éléments.
Messages postés
121
Date d'inscription
vendredi 31 mars 2006
Statut
Membre
Dernière intervention
30 décembre 2010

Salut,

Cependant, je pense que GROUP BY est plus performant que DISTINCT...
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
14
Cependant, je pense que GROUP BY est plus performant que DISTINCT...


mysql> SELECT COUNT(DISTINCT fact) FROM plop;
+----------------------+
| COUNT(DISTINCT fact) |
+----------------------+
|                42000 |
+----------------------+
1 row in set (0.00 sec)

mysql> SELECT count(*), fact FROM plop WHERE fact IS NOT NULL GROUP BY fact ;
+----------+------------+
| count(*) | fact       |
+----------+------------+
|        1 |     127025 |
/* snip */
|        1 | 2147332144 |
+----------+------------+
42000 rows in set (0.07 sec)

Génial ton optimisation, non seulement c'est carrément plus lent) mais en plus on récupère des tonnes de données dont on a strictement rien à faire...
Messages postés
54
Date d'inscription
mercredi 4 mai 2005
Statut
Membre
Dernière intervention
10 septembre 2012

J'ai retesté les rq du premier post, toutes me donne les éléments égale à 0 comme étant 1 élément distinct !?

morpheus > est il nécessaire de faire une boucle pour récupérer un résultat unique ?


DapORoty
Messages postés
121
Date d'inscription
vendredi 31 mars 2006
Statut
Membre
Dernière intervention
30 décembre 2010

Géniale ta comparaison :
Tu compares 2 requêtes qui ne font pas la même chose
Messages postés
121
Date d'inscription
vendredi 31 mars 2006
Statut
Membre
Dernière intervention
30 décembre 2010

TychoBrahe > De plus pour comparer des temps d'exécution de requêtes tu me ferais plaisir en utilisant SQL_NO_CACHE
Messages postés
121
Date d'inscription
vendredi 31 mars 2006
Statut
Membre
Dernière intervention
30 décembre 2010

daporoty > Non, mais je pensais que tu voulais récupérer un truc du genre :

Valeur 1 - Nombre d'utilisation
Valeur 2 - Nombre d'utilisation
...
Valeur n - Nombre d'utilisation
Messages postés
54
Date d'inscription
mercredi 4 mai 2005
Statut
Membre
Dernière intervention
10 septembre 2012

Quand j'affiche le resultat des rq postées ici depuis le début, toutes me donne le 0 comme un élément distinct quand il est présent.
J'arrive pas à compter les résultat sans le 0 ...

DapORoty
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
14
Tu compares 2 requêtes qui ne font pas la même chose

Excuse moi, je croyais que tu répondais à la problématique du présent sujet qui est de connaitre le nombre d'entrées différentes dans la base.

De plus pour comparer des temps d'exécution de requêtes tu me ferais plaisir en utilisant SQL_NO_CACHE

C'est vrai, avec les test que j'avais fait avant ça change tout : le COUNT n'est "que" deux fois plus rapide que la sélection avec GROUP BY.

toutes me donne le 0 comme un élément distinct quand il est présent

0 est une valeur, si tu veux ne pas affecter de valeur à un champ il te faut utiliser NULL.