plusieurs count(*) avec plusieurs WHERE avec des if

plusieurs count(*) avec plusieurs WHERE avec des if - SQL/NoSQL - Programmation

Marsh Posté le 27-07-2005 à 00:00:45    

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

Reply

Marsh Posté le 27-07-2005 à 00:00:45   

Reply

Marsh Posté le 27-07-2005 à 01:54:07    

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.

Reply

Marsh Posté le 27-07-2005 à 01:57:18    

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:

Reply

Marsh Posté le 27-07-2005 à 08:40:07    

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 ?

Reply

Marsh Posté le 27-07-2005 à 09:41:39    

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.

Reply

Marsh Posté le 27-07-2005 à 09:44:06    

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à...

Reply

Marsh Posté le 28-07-2005 à 00:15:39    

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'


 

Reply

Marsh Posté le 28-07-2005 à 00:52:56    

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' ;)

Reply

Marsh Posté le 28-07-2005 à 23:18:53    

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

Reply

Marsh Posté le 03-08-2005 à 15:37:38    

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
Reply

Marsh Posté le 03-08-2005 à 15:37:38   

Reply

Marsh Posté le 03-08-2005 à 15:42:36    

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}
Reply

Sujets relatifs:

Leave a Replay

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