|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||
|
Membre du Club
![]() Inscription : octobre 2009 Messages : 59 ![]() |
Bonjour j'aurais besoins d'aide sur des requêtes sur des tables contenant peu de données.
Code :
Le EXPLAIN me donne ceci Citation:
Quelqu'un aurait il une piste ? Merci d'avance EDIT: Soluce sur toute la discussion en gros les fonctions qui font des requêtes qu'on utilise dans d'autres requêtes c'est pas bien |
|||
|
|
00
|
|
|
#2 |
![]() ![]() |
Ne serait-ce pas tes fonctions qui plombent l'exécution ?
__________________
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
|
|
|
#3 |
|
Membre du Club
![]() Inscription : octobre 2009 Messages : 59 ![]() |
Je ne suis pas au travail là tout de suite maintenant, je n'y donc pas accès, cependant ces fonctions ne font que des SUM, sur d'autre tables, ça peu gêner à ce point ?
Du coup je ferais l'essaie de la requête sans les fonctions histoires de voir ce que ça donne. Merci |
|
|
00
|
|
|
#4 | |||
![]() ![]() |
Citation:
Code :
Je pense qu'il vaudrait beaucoup mieux tout rassembler dans la grosse requête. Ça te ferait une sous-requête avec tous les calculs lancés par tes fonctions, avec un GROUP BY sur REF_ARTICLE et NUM_COMMANDE puisque ce sont les paramètres de tes fonctions. Puis dans la requête principale, tu récupères les autres colonnes souhaitées à l'aide d'une jointure sur la sous-requête. Essaie de la faire tout seul et si tu n'y arives pas, on t'aidera à la faire si tu nous donnes la structure des tables impliquées, le but rechercher et les règles de calcul + bien sûr la requête que tu auras essayée.
__________________
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
|
|
|
#5 | ||||
|
Membre du Club
![]() Inscription : octobre 2009 Messages : 59 ![]() |
Ah bordel à cul c'était vraiment les fonctions qui plombaient, il faut pardonner au développeur de client lourd que je suis qui a l'habitude d'écrire des fonctions partout >_>
bon j'ai écrit ça du coup Code :
Code :
|
||||
|
|
00
|
|
|
#6 | ||||||||
![]() ![]() |
1) Optimisation potentielle
Les sous-requêtes IMB et DECO ne pourraient-elles être rassemblées en une seule puisqu'elles sont construites pareil ? Ou bien les deux conditions Tole.IMBRIQUER = 1 et Tole.DECOUPE = 1 sont-elles incompatibles ? 2) Données aléatoires dans le SELECT ! Comme tu groupes ta grosse requête seulement par commande.NUM_COMMANDE, article.REF_ARTICLE, les colonnes du SELECT qui ne font pas l'objet d'un calcul et qui ne sont pas en dépendance directe des colonnes du GROUP BY donneront des valeurs aléatoires ! Un autre SGBD que le trop permissif MySQL refuserait ta requête à cause de ça ! J'avais dit dans mon message qu'il fallait regrouper dans une sous-requête puis récupérer les autres colonnes par une jointure. Au fait, un article pour une commande ne figure que dans une seule ligne non ? N'est-ce donc pas tout simplement un regroupement par ligne ? 3) COALESCE Au lieu de IF(ISNULL(une_colonne, 0, quelquechose), il existe la fonction COALESCE qui retourne la première expression non nulle dans une liste : Code :
Pour alléger la lecture de la requête, je préfère utiliser les alias partout. Appliquons tout ça à ta requête, en commençant par le point 2 puisqu'il y a une interrogation sur le point 1. Dans ton SELECT, les deux lignes suivantes contiennent des calculs : Code :
Ce qui donne ceci, avec le COALESCE et les alias : Code :
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
|
|
|
#7 | ||||||||||
|
Membre du Club
![]() Inscription : octobre 2009 Messages : 59 ![]() |
Citation:
Citation:
groupement m'assure d'une relation 1 à 1 pour chaque table, un client pour une commande et une ligne pour une paire commande/article, donc en théorie j'ai toujours le bon résultat, ou j'ai oublié mes cours de SQL à ce point ? Citation:
Citation:
Bon en gros trois fautes de frappes à corriger, ça marche aussi bien mais franchement j'ai du mal à voir l'intérêt |
||||||||||
|
|
00
|
|
|
#8 | |||||
![]() ![]() |
Citation:
Citation:
Si tu as la table A idA, colA1 1, toto 2, titi Et la table B idB, idA, colB1, colB2 1, 1, papa, 12 2, 1, maman, 8 3, 2, frérot, 5 Et que tu fais la requête suivante, autorisée par MySQL mais refusée par tout SGBDR normatif : Code :
A.idA, A.colA1, MIN(B.colB2), B.colB1 1, toto, 8, papa 2, titi, 5, frérot Alors que la valeur MIN de B.colB2 est bien 8 mais que ça correspond à maman et non à papa. Citation:
__________________
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
|
|
|
#9 | |||
|
Membre du Club
![]() Inscription : octobre 2009 Messages : 59 ![]() |
Citation:
Une ou deux virgules manquantes, et un copié/collé un peu foireux pour la sous requête DECO Mais du coup merci mon problème est résolu |
|||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com