[PHP/MySQL] count(*) et nombre de résultats NULL

count(*) et nombre de résultats NULL [PHP/MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 19-07-2005 à 18:53:06    

Bonjour, voilà mon problème :
j'ai cette fonction :

Code :
  1. $query="select count(*) from chval where lieu=1 and mort=1 and proprete>3 and idm=$_SESSION[idm] group by idm";
  2. $result=mysql_query($query,$link);
  3. $row=mysql_fetch_row($result);
  4. //traitement à partir des résultats de la requête...


 
Seulement, parfois, le résultat est 0, or j'ai vu dans la doc MySQL que count(*) ne supporte pas les nombres de résultats NULL : connaitriez-vous une manière de contourner le pb ?
 
Merci d'avance :jap:

Reply

Marsh Posté le 19-07-2005 à 18:53:06   

Reply

Marsh Posté le 19-07-2005 à 19:17:16    

Pour l'instant, j'ai contourné en faisant :

Code :
  1. $query="select count(*) from chval where lieu=1 and mort=1 and proprete>3 and idm=$_SESSION[idm] group by idm";
  2. $result=mysql_query($query,$link);
  3. if ($row=mysql_fetch_row($result))
  4. {
  5.     //traitemnt à partir des résultats de la requête...
  6. }
  7. else
  8. {
  9.     //traitement dans le cas où le résultat est 0
  10. }


 
Il n'y a pas une façon plus propre de faire ça ?


Message édité par nero27 le 19-07-2005 à 19:17:42
Reply

Marsh Posté le 19-07-2005 à 19:33:18    

1/ vire ton "group by idm" il est inutile.
 
Sinon, je ne comprends pas exactement ce que tu as comme problème, et ce que tu attends.
 
Ta requête ne retourne "rien" (aucune ligne) ou "zéro" (valeur 0 indiquant qu'il n'y a aucune ligne).
 
Si t'as aucune ligne, mais que tu veux 0, alors le simple fait de virer le IDM du group by devrait résoudre le problème il me semble (on ne peux pas regrouper des lignes sur un critère qui n'existe pas, hors dans ton cas, si aucune ligne ne correspond à la valeur de IDM, il ne peux rien grouper dessus). Si ça ne suffit pas, tu peux tenter de faire un is_null(count(*), 0) mais je ne pense pas que ça résolve le problème.


Message édité par Arjuna le 19-07-2005 à 19:34:03
Reply

Marsh Posté le 19-07-2005 à 22:41:56    

euu j'ai compri 2 chose differentes :  
1 : count peut renvoyer null ou 0. -> si c ca pas de problèmes count renvoie tjs au pire 0.
2 : il y'a unproblème qd le champs a comptabiliser vaut null.
dans ce cas tu utilises la fonction nvl(champ,valeur a remplacer)
qui pour tt les champ a null va te mettre la valeur specifiée.
 

Reply

Marsh Posté le 20-07-2005 à 12:37:01    

En fait, si tu fais un COUNT sans regroupement, alors il retourne 0
Si tu fais un COUNT avec un group by sur un champ dont des valeurs sont trouvées, mais pas de ligne en correspondance, alors ça vaut 0
Si tu fais un COUNT avec un group by sur un champ dont on ne trouve aucune valeur qui correspond aux filtres, alors ça ne retourne pas de ligne.
 
Exemple :
 
select count(*) from latable where 0 = 1
-> Retourne 0
 
select count(*) from latable group by nom
-> Retourne une valeur ou 0 pour chaque valeur possible de nom
 
select count(*) from latable where nom <> nom group by nom
-> Ne retourne aucune ligne, car aucune valeur du champ de regroupement n'a été trouvée

Reply

Marsh Posté le 20-07-2005 à 12:42:40    

Tiens, quoi que non, j'ai dit une connerie, même dans l'avant dernier cas SQL Server ne retourne rien :D
 
C'est chelou d'ailleurs :D
 

Code :
  1. select * from tsttbl
  2. select count(*) from tsttbl
  3. select count(*) from tsttbl group by id
  4. select count(*) from tsttbl where val < 0 group by id
  5. select count(*) from tsttbl where id <> id group by id


 

Code :
  1. id                   val                 
  2. -------------------- --------------------
  3. 4                    123
  4. (1 ligne(s) affectée(s))
  5.            
  6. -----------
  7. 1
  8. (1 ligne(s) affectée(s))
  9.            
  10. -----------
  11. 1
  12. (1 ligne(s) affectée(s))
  13.            
  14. -----------
  15. (0 ligne(s) affectée(s))
  16.            
  17. -----------
  18. (0 ligne(s) affectée(s))


 
Par contre tu peux contourner le problème comme suis (traduit pour MySQL)
 

Code :
  1. select top 1 * from (
  2. select count(*) yo from tsttbl where val < 0 group by id
  3. union select 0 yo
  4. ) prout
  5. order by yo desc


Message édité par Arjuna le 20-07-2005 à 12:43:17
Reply

Marsh Posté le 20-07-2005 à 12:58:54    

ok, merci pour vos explications :jap:
Je vais enlever le group by idm et tout devrait fonctionner ;)


Message édité par nero27 le 20-07-2005 à 12:59:15
Reply

Marsh Posté le 20-07-2005 à 13:53:04    

nero27 a écrit :

ok, merci pour vos explications :jap:
Je vais enlever le group by idm et tout devrait fonctionner ;)


 
Et pour la forme .. mets pas count(*), mais count(cle_primaire), c'est pour toi avoir des meilleures performances :hello:

Reply

Marsh Posté le 20-07-2005 à 14:24:53    

alien_nan a écrit :

Et pour la forme .. mets pas count(*), mais count(cle_primaire), c'est pour toi avoir des meilleures performances :hello:


Merci pour le conseil :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed