|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Bonjour,
dans une table j'ai un champ nommé symbole ainsi qu'un champ nommé sens (valant 0, 1 ou 2). Pour chaque symbole, je peux avoir 1, 2 ou 3 sens. Je cherche faire une requête de groupement me retournant dans n'importe quelles conditions la somme des sens par symbole. Code sql :
me retourne (par exemple) : symbole1 0 1000 symbole1 1 200 Moi je souhaiterais avoir cette forme de résultat : symbole1 0 1000 symbole1 1 200 symbole1 2 0 bref avoir quoi qu'il arrive les 3 sens avec une somme des quantité valant éventuellement 0. Comment faire ceci ? Merci |
||
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour
Code sql :
|
||
|
|
00
|
|
|
#3 | ||
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Bonjour et merci de ta réponse. Je me doutais bien qu'il fallait utiliser COALESCE mais je bloquais sur la jointure, j'essayais de tout faire d'un bloc...
Par contre, ca me retourne le même résultat au final J'ai testé : Code sql :
puis en testant avec un RIGHT OUTER JOIN qui me semblait plus logique mais sans résultat... |
||
|
|
00
|
|
|
#4 | |||||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Tout a fait, il faut un RIGHT OUTER JOIN, une erreur de ma part
Citation:
Votre RIGHT OUTER JOIN vous donnera un NULL pour date_heure quand il n'y aura aucune correspondance dans la table historique, et donc votre condition dans la clause WHERE ne pourra pas être vérifiée. Ajoutez OR date_heure IS NULL : Code sql :
|
|||||
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
effectivement, en testant le IS NULL, cela semble beaucoup plus logique merci. Par contre, toujours les mêmes résultats...
Et chose étrange avec le LEFT j'ai un temps de requête de 0.5s, avec le RIGHT et le IS NULL j'obtiens 7,5s ! J'ai une course à faire je reviendrai plus tard. Merci de votre implication
|
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
en effet, je me suis basé sur votre exemple avec un seul symbole, mais des qu'il y en as plusieurs...
il faut donc faire le produit cartésien de vos différents symboles, avec vos différents sens, et ensuite une jointure, pour n'oublier personne Code sql :
Pour faire propre et bien, ces pseudo tables devraient être de vraies tables : Symboles(IDSymbole, nomSymbole) Sens(IDSens, libelleSens) Historique(IDSymbole, IDSens, Dateheure) |
||
|
|
00
|
|
|
#7 | ||
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Merci pour ta réponse
Voilà ce que j'ai essayé de mon côté : Code sql :
j'obtiens bien les bon symboles, les 3 sens mais les sommes des quantités ne sont pas bonnes... Je continue à rechercher |
||
|
|
00
|
|
|
#8 | ||
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Héhé trouvé, il manquait une autre condition de jointure
Code sql :
(suis pas contre une optimisation ^^) |
||
|
|
00
|
|
|
#9 | ||
![]() ![]() |
Comme a dit aieeeuuuuu, une table des sens aurait été préférable.
Les valeurs textuelles s'écrivent entre apostrophes et pas entre guillemets. Comme tu veux tous les sens, il faut partir de la table des sens (ou sa construction par les requête UNION) et faire un LEFT JOIN vers la table historique. Et comme tu as une condition sur une colonne de la table historique, il faut mettre celle-ci dans la condition de jointure sinon c'est équivalent à un INNER JOIN, comme je l'explique dans mon blog. Est-ce que cette requête plus simple ne donnerait pas le bon résultat par hasard ? Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#10 | |||
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Bonjour CinePhil et merci pour ces explications. Ta requête me donne les bons résultats excepté que je n'ai que les sens significatifs (>0) je n'ai pas les sens dont la quantité n'est pas > 0.
Autre chose, j'exécute cette requête en 7s environ contre 1s pour la mienne (malgré les apparences !). Je pense, sans en être sur, que la condition de jointure sur la date fait ramer au possible. C'est pour cette raison que j'avais essayé de constituer des groupes "filtrés" sur les heures avant d'effectuer les diverses jointures. Pour infos, voici ma dernière mouture un poil modifié afin de ne sélectionner que les symboles dont insertions.code != NULL : Code sql :
PS: pour info, ma table insertions fait et fera toujours 20 lignes donc le temps de calcul du produit cartésien est négligeable. Quant à ma table historique, elle fait actuellement 450k lignes et augmente de 20k lignes par jour Citation:
Merci de ton implication EDIT: et quand aux simples quotes, est ce la norme ? J'avoue qu'avec mon code PHP les doubles quotes me plaisent mieux sinon faut que je backquote tout |
|||
|
|
00
|
|
|
#11 |
![]() ![]() |
La colonne date_heure est-elle de type datetime ou timestamp ?
Si oui, pourquoi t'embêter avec le DATE_FORMAT ? DATE_FORMAT empêche probablement l'utilisation d'un index. Cette colonne est-elle d'ailleurs indexée ? DISTINCT + GROUP BY, ça fait double emploi ! À mon avis, le DISTINCT est inutile. Je ne sais pas si c'est parce que j'ai les neurones engourdis par la maladie mais j'ai beau relire ma requête, je ne vois pas pourquoi elle ne te donne pas le bon résultat. On peut avoir la structure de la table historique et un petit jeu de données pour tester ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#12 | ||
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Bonjour, voilà mes 2 tables ainsi qu'un petit jeu de test modifié pour l'occasion :
Code sql :
PS: ne pas faire attention à ma structure de table PS2: ma clé de jointure étant en varchar(10) j'ai essayé de mettre un index dessus mais la requête était beaucoup plus lente ensuite
|
||
|
|
00
|
|
|
#13 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
Il lui faut tous les symboles pour tous les sens. Donc il faut un produit cartésien, sinon si un symbole n'a pas tous les sens, mais qu'un autre symbole a le sens en question,un LEFT OUTER JOIN renverra une seule ligne, au lieu de deux... Citation:
Aussi, as-tu essayé la dernière requete que je t'ai envoyé ? qu'est ce que ca donne ? |
||
|
|
00
|
|
|
#14 | |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Bonjour aieeeuuuuu
Citation:
|
|
|
|
00
|
|
|
#15 | ||
![]() ![]() |
Essaie ça :
Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#16 | |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
heu... il a pas dit quand est-ce qu'il comptait revenir ![]() plus sérieusement, il n'y a rien dans les logs, aucun message d'erreur ? je n'ai pas de MySQL sous la main pour tester, mais c'est quand même violent comme erreur pour une requete qui n'a rien d'extraordinaire... Citation:
Perso je verrais deux index : Un index unique sur la colonne symbole de ta table insertions Un index sur les colonnes (Symbole, sens, dateheure) de ta table historique, unique si tu n'a pas plusieurs mesures pour un symbole et un sens à une date donnée |
|
|
|
00
|
|
|
#17 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Bonjour CinePhil,
il semble qu'en mettant une condition de jointure sur date_heure, la requête n'aboutisse pas (du moins ta requête est toujours en train de tourner sur mon pc !). C'est pour cela que j'ai filtré avec un WHERE sur chaque groupe de jointure. Ce groupe sera constitué journalièrement de 20 lignes maximum au lieu des 450k lignes actuelles sur lequel porte ta jointure. Je pense que le delta de temps provient de là. |
|
|
00
|
|
|
#18 | ||
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Citation:
Mince maintenant PHPMyAdmin est dans les choux Citation:
|
||
|
|
00
|
|
|
#19 |
![]() ![]() |
Tu peux faire un EXPLAIN de ma requête et nous donner le résultat ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#20 | |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Voici le EXPLAIN :
Citation:
|
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com