Problème avec COUNT et DISTINCT

daporoty Messages postés 54 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 10 septembre 2012 - 29 déc. 2010 à 15:10
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 - 30 déc. 2010 à 22:53
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

16 réponses

cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010
29 déc. 2010 à 16:59
Salut,

Et comme ça :
SELECT count(*), fact FROM statut WHERE fact IS NOT NULL GROUP BY fact
0
daporoty Messages postés 54 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 10 septembre 2012
30 déc. 2010 à 03:14
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
0
cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010
30 déc. 2010 à 09:15
Re bonjour,

Je ne peux pas t'aider si tu ne me dis pas ce qu'il y a dans ta table.
0
daporoty Messages postés 54 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 10 septembre 2012
30 déc. 2010 à 12:59
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010
30 déc. 2010 à 14:13
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 ?
0
daporoty Messages postés 54 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 10 septembre 2012
30 déc. 2010 à 15:10
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
0
cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010
30 déc. 2010 à 15:17
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]);
}
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
30 déc. 2010 à 15:29
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.
0
cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010
30 déc. 2010 à 15:40
Salut,

Cependant, je pense que GROUP BY est plus performant que DISTINCT...
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
30 déc. 2010 à 15:54
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...
0
daporoty Messages postés 54 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 10 septembre 2012
30 déc. 2010 à 16:39
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
0
cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010
30 déc. 2010 à 16:44
Géniale ta comparaison :
Tu compares 2 requêtes qui ne font pas la même chose
0
cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010
30 déc. 2010 à 16:48
TychoBrahe > De plus pour comparer des temps d'exécution de requêtes tu me ferais plaisir en utilisant SQL_NO_CACHE
0
cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010
30 déc. 2010 à 16:59
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
0
daporoty Messages postés 54 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 10 septembre 2012
30 déc. 2010 à 16:59
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
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
30 déc. 2010 à 22:53
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.
0