plusieurs count(*) avec plusieurs WHERE avec des if - SQL/NoSQL - Programmation
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.
Marsh Posté le 27-07-2005 à 01:57:18
Ha ben si en fait
Code :
|
Essaie d'adapter ça à ta bouse
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 ?
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.
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. |
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à...
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 :
|
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 :
|
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'
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
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 :
|
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.
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.
Marsh Posté le 27-07-2005 à 00:00:45
Salut
Je me demande simplement si au lieu de faire plusieurs requetes du style
on ne pourrait pas tout faire en une requete avec des IF ?
un truc (qui n'existe pas) du style
l'intérêt de tout cela est très limité, mais serait ce faisable ?
Merci d'avance