Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1700 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  plusieurs count(*) avec plusieurs WHERE avec des if

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

plusieurs count(*) avec plusieurs WHERE avec des if

n°1160921
matthieu_p​hpmv
Posté le 27-07-2005 à 00:00:45  profilanswer
 

Salut
 
Je me demande simplement si au lieu de faire plusieurs requetes du style
 

Code :
  1. SELECT count(*) FROM toto WHERE mama > x


Code :
  1. SELECT count(*) FROM toto WHERE mama > y


 
 
on ne pourrait pas tout faire en une requete avec des IF ?
 
un truc (qui n'existe pas) du style
 

Code :
  1. SELECT IF(mama > x) THEN count(*) as x,IF(mama > y) THEN count(*) as y FROM toto


 
l'intérêt de tout cela est très limité, mais serait ce faisable ?
Merci d'avance

mood
Publicité
Posté le 27-07-2005 à 00:00:45  profilanswer
 

n°1160988
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2005 à 01:54:07  profilanswer
 

Hmmm... A froid, je dirais que c'est pas possible.
 
Demain, je devrais avoir du temps pour regarder de plus près si je trouve une solution à ce problème.

n°1160990
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2005 à 01:57:18  profilanswer
 

Ha ben si en fait :)
 

Code :
  1. select sum(case when xterrain > 5 then 1 else 0 end) x, sum(case when xterrain > 8 then 1 else 0 end) y from terrain


 
Essaie d'adapter ça à ta bouse :whistle:

n°1161052
Beegee
Posté le 27-07-2005 à 08:40:07  profilanswer
 

Je vois pas trop l'intérêt, et je comprends pas pourquoi tout le monde se casse la tête à toujours vouloir tout écrire en une requête.
 
Tu veux faire ça avec combien de valeurs différentes ? 2 ? 1000 ?

n°1161100
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2005 à 09:41:39  profilanswer
 

j'ai testé avec SQL Server et pour 108000 lignes (c'est la base de mon bench), ça a mis moins d'une seconde. Pourtant xtrerrain n'est pas du tout premier membre d'un index, donc on est loin d'être dans un cas idéal.

n°1161101
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2005 à 09:44:06  profilanswer
 

Beegee a écrit :

Je vois pas trop l'intérêt, et je comprends pas pourquoi tout le monde se casse la tête à toujours vouloir tout écrire en une requête.
 
Tu veux faire ça avec combien de valeurs différentes ? 2 ? 1000 ?


ben pour peux que tu passes par une connection ODBC ou un réseau moyennement rapide, c'est très important : l'ouverture et la fermeture de la requête prend généralement jusqu'à 10 fois plus de temps que la requête elle-même, donc moins on en fait et mieu c'est, surtout quand c'est des petits trucs comme ça... quand c'est une requête qui dure plus de 30 secondes, en effet, on ne gagne rien à tout mettre en une seule requête... mais là...

n°1162406
matthieu_p​hpmv
Posté le 28-07-2005 à 00:15:39  profilanswer
 

merci pour ton aide, c'est tout à fait ça. Bien joué la feinte du sum(if toto then 1 else 0 end) je n'y aurais pas pensé ;-)
 
avec le sgbd qui déchire (mysql) ça donne, dans mon cas
 
 

Code :
  1. SELECT sum(case when (c_total_pages >= '20' AND c_total_pages <= '10000') THEN 1 else 0 end) as s FROM visit WHERE  server_date = '2005-07-25' AND idsite = '1'


 

n°1162442
Arjuna
Aircraft Ident.: F-MBSD
Posté le 28-07-2005 à 00:52:56  profilanswer
 

euh, sauf que dans ton cas, à moins que je sois complètement à côté de la plaque, là tu peux faire :
 

Code :
  1. SELECT count(*) as s
  2. FROM visit
  3. WHERE  server_date = '2005-07-25'
  4. AND idsite = 1
  5. and c_total_pages between 20 AND 10000


 
;)
 
PS: et évite les ' autour des valeurs numériques, parceque ça ralenti les traîtements, et surtout, s'il décide de caster les valeurs numériques en chaînes (normalement il ne dois pas le faire), alors les résultat seront totalement faux.
En effet, '20' > '10000' donc en aucun cas une variable peut être à la fois plus grande que '20' et plus petite que '10000' ;)

n°1164082
matthieu_p​hpmv
Posté le 28-07-2005 à 23:18:53  profilanswer
 

oui en fait je me suis planté, disons que j'ai oublié un bout de la requete, je n'ai mis qu'un sum(case otot...) alors qu'il y en aurait par exemple 17 différents, après le select.
 
Idem dans mon source je n'ai pas mis les guillemets simples, car effectivement ça ne le fait pas sur champ INT
 
Merci

n°1169010
matthieu_p​hpmv
Posté le 03-08-2005 à 15:37:38  profilanswer
 

Arjuna ton astuce ici est en fait CARREMENT UNE TUERIE.
C'est trop utile, dans mon cas en tout cas, en gros en une requête  
 

Code :
  1. "SELECT count(*) as s, entry_idpage as c, sum(case total_pages when 1 then 1 else 0 end) as t
  2.    FROM visit
  3.    WHERE server_date = '".$this->date->get()."'
  4.    AND idsite = ".$this->site->getId()."
  5.    GROUP BY c"


 
j'obtiens énormément d'infos
ça permet de compter une partie des résultat du GROUP BY sans omettre le reste, comme on ferait avec un having
sans ton astuce, je ne pense pas que j'aurai d'ailleur pu faire tout ce que je souhaite.


Message édité par matthieu_phpmv le 03-08-2005 à 15:38:36

---------------
développeur de phpMyVisites mesure d'audience de sites Internet
mood
Publicité
Posté le 03-08-2005 à 15:37:38  profilanswer
 

n°1169015
sircam
I Like Trains
Posté le 03-08-2005 à 15:42:36  profilanswer
 

Citation :

Je vois pas trop l'intérêt, et je comprends pas pourquoi tout le monde se casse la tête à toujours vouloir tout écrire en une requête.


Parfois, le temps de latence du réseau prend le dessus sur l'exécution de la requête elle-même. Dans ce cas, il est bon d'avoir une requête plutôt que dix, même si le temps d'exécution sur le DBMS reste identique.
 

Citation :

ben pour peux que tu passes par une connection ODBC ou un réseau moyennement rapide, c'est très important : l'ouverture et la fermeture de la requête prend généralement jusqu'à 10 fois plus de temps que la requête elle-même, donc moins on en fait et mieu c'est, surtout quand c'est des petits trucs comme ça.


C'est indépendant de l'ouverture/fermeture de la connection, nous somme bien d'accord. Même en ne n'utilisant qu'une seule connection, il est souvent plus judicieux de faire une requête plutôt que 10.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  plusieurs count(*) avec plusieurs WHERE avec des if

 

Sujets relatifs
integrer une donnée entrée par l'utilisateur dans un WHEREinterroger plusieurs tables
[php] récupérer plusieurs arguments [RESOLU]CONCATENER UNE PHRASE PLUSIEURS FOIS SOUS DOS
Plusieurs setups dans un seul[ SQL ] Regrouper et sommer plusieurs lignes selon critères
[PHP/MySQL] count(*) et nombre de résultats NULL[VBS] Redimensionner un tableau a plusieurs dimensions
Réunir plusieurs cookies en un[.BAT] Executer plusieurs programmes à la suite
Plus de sujets relatifs à : plusieurs count(*) avec plusieurs WHERE avec des if


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR