|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Invité régulier
![]() Christophe Inscription : mars 2011 Messages : 22 ![]() |
Bonsoir à toutes et à tous,
J'ai un petit problème de requete, J'aimerai afficher des données contenant un prix produit où ce prix varie suivant la date de la commande. J'arrive à afficher les données mais le prix est toujours le même (le dernier enregistré dans la base de données). voici la requete : Code :
- Ligne_commande Citation:
Citation:
Citation:
Citation:
Merci par avance |
||||||
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Code :
Cette sous-requête PR serait une bonne candidate pour une vue, mais je crois que MySql n'aime pas les sous-requêtes dans les vues.... |
||
|
|
10
|
|
|
#3 |
|
Invité régulier
![]() Christophe Inscription : mars 2011 Messages : 22 ![]() |
Impressionnant !!
![]() j'aurais jamais trouvé tout seul. Je pense que je me suis aventuré un peu trop loin de chez moi la J'ai du mettre 15min pour comprendre la requête. Je te remercie énormément. J'ai essayé d'en faire une vue mais MySql la refuse. Encore merci à toi. |
|
|
00
|
|
|
#4 | ||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Content que ça convienne, mais effectivement j'aurais pu ajouter plus de commentaires, je vais le faire maintenant puisque j'ai du temps, ça pourra toujours être utile pour de futurs lecteurs.
La partie intéressante est : Code :
L'idée est de récupérer les lignes des "dates suivantes" (pr2.date_prix > pr1.date_prix) par CODE_PRODUIT (pr2.CODE_PRODUIT = pr1.CODE_PRODUIT). Et pour récupérer uniquement la "date qui suit", j'utilise MIN. (à noter qu'une requête corrélée dans un SELECT ne peux renvoyer qu'une ligne) Par "date qui suit" j'entends la ligne suivante lorsqu'on trie la table PRIX sur CODE_PRODUIT,DATE_PRIX. J'espère que c'est à peu près clair... Par contre pour avoir de bonne performance sur ce genre de requetête corrélée il faut créer un index sur PRIX(CODE_PRODUIT,DATE_PRIX): Code :
CREATE INDEX idx_prix_code_date ON prix (CODE_PRODUIT,DATE_PRIX) Code :
CREATE INDEX idx_prix_code_date ON prix (CODE_PRODUIT,DATE_PRIX,CODE_PRIX,PRIX_KILO) Un dernier point concerne COALESCE(PR.DATE_FIN_PRIX,CURRENT_DATE). Comme pour chaque CODE_PRODUIT la "dernière" DATE_FIN_PRIX sera NULL j'utilise COALESCE pour associer la date du jour (CURRENT_DATE) lorsque DATE_FIN_PRIX est NULL pour que le BETWEEN fonctionne correctement. |
||
|
|
20
|
|
|
#5 |
|
Invité régulier
![]() Christophe Inscription : mars 2011 Messages : 22 ![]() |
merci encore pour ton aide.
Ton explication est intéressante et utile. Une question me vient à l'esprit, étant débutant dans la programmation, je trouve ce genre de requête assez compliqué. J'aimerai savoir si dans les applications/sites web utilisant une BDD avec prix différent suivant la date (site marchant, logiciel de gestion...) utilisent ce genre de requête ou utilisent une méthode différente peut être plus rapide ? Merci par avance. |
|
|
00
|
|
|
#6 | |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Citation:
Il n'y a rien, en soi, de compliqué dans cette requête. C'est juste que la logique relationnelle peut apparaître très déroutante pour qui n'en est pas familier. Quant au fond de ta question, une analyse complète de la problématique aurait peut-être conduit à une autre modélisation de la base de données mais, l'expérience prouve que nombre d'entorses aux formes normales, justifiées en amont par des préoccupations d'optimisation, finissent par se montrer très pénalisantes en logique relationnelle sur le long terme.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|
|
00
|
|
|
#7 | |||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Je suis d'accord avec Maljuna Kris, la requête n'est pas compliquée en soit mais le SQL, comme tout langage, nécessite un apprentissage, d'autant qu'il faut résonner de façon ensembliste plutôt que procédurale, ce qui ne simplifie pas son approche.
Par contre pas de soucis avec avec le modèle, en tout cas SqlPro propose ici un exemple similaire: http://www.developpez.net/forums/d36...s/#post3256642 Mais la limitation de MySql sur les vues est pénible. Citation:
Code :
|
|||
|
|
00
|
|
|
#8 |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Remarque bien que résonner (comme une cloche) c'est comme réfléchir (comme un miroir)
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|
00
|
|
|
#9 |
|
Invité régulier
![]() Christophe Inscription : mars 2011 Messages : 22 ![]() |
Ok merci des renseignements.
Cela fait 6ans que j'ai pas touché de requetes et déjà à l'époque je n'avais vu que les principes de base. Si je comprend bien, va falloir que je m'y fasse |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com