|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Membre habitué
![]() Inscription : juin 2004 Messages : 296 ![]() |
Bonjour à tous,
J'ai besoin de votre aide pour construire et optimiser une requête SQL. Je vous explique : j'ai une table qui liste des articles et une autre qui contient l'historique de changement de statut de mes articles. J'ai besoin en une seule requête de récupérer la liste des articles avec pour chacun d'entre eux son dernier statut et la date de son dernier statut. Je vous ai modelisé les tables pour faciliter la compréhension : ![]() J'ai d'abord pensé à faire une requête du genre : Code :
Est-ce que quelqu'un aurait une idée ? Merci d'avance. |
||
|
|
00
|
|
|
#2 | ||
|
Membre confirmé
![]() Développeur informatique Inscription : avril 2011 Messages : 196 ![]() |
Moi je pensais a cette solution
Code :
|
||
|
|
10
|
|
|
#3 |
|
Membre habitué
![]() Inscription : juin 2004 Messages : 296 ![]() |
Bonjour fab256,
Merci pour ta réponse. Penses-tu que c'est la seule solution car j'ai un peu peur des performances... en sachant que pour un article, je peux avoir jusqu'à 10 statuts d'historique ? |
|
|
00
|
|
|
#4 | ||
|
Membre habitué
![]() Robert LabrousseDéveloppeur décisionnel Inscription : février 2009 Messages : 79 ![]() |
Bonjour,
Essaye cela peut-être (non testé), je ne sais pas si les temps de réponses sont mieux : Code :
|
||
|
|
20
|
|
|
#5 |
|
Membre confirmé
![]() Développeur informatique Inscription : avril 2011 Messages : 196 ![]() |
Effectivement la requette de tfc3146 est beaucoup plus performante , j'ai fait un petit test sur l'exemple cité plus haut ca prends 0.0011 sec alors que la solution que j'ai proposé prends 0.0393 sec.
|
|
|
00
|
|
|
#6 |
|
Membre habitué
![]() Inscription : juin 2004 Messages : 296 ![]() |
Je vous remercie pour vos réponses.
Je vais donc opter pour la solution de tfc3146. Si jamais une autre personne trouve encore mieux, je suis preneur. Merci encore. |
|
|
00
|
|
|
#7 |
|
Membre habitué
![]() Inscription : juin 2004 Messages : 296 ![]() |
Bonjour,
Je relance ce post car je rencontre un problème lorsque les deux derniers statuts de mon article ont la même date. Dans ce cas là, la requête de tfc3146 me renvoie deux lignes de résultats pour un même article. Est-ce qu'il y a moyen de modifier la requête pour ne récupérer, pour un article, que le statut ayant la max(date) et dont l'id du statut (sta_id) est le plus élevé ? cela me permettrait de n'avoir qu'un statut par article et donc qu'une ligne par article... Merci à vous. |
|
|
00
|
|
|
#8 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
bonjour,
lisez ceci : http://sqlpro.developpez.com/cours/sqlaz/ensembles/ En particulier la partie sur le group by |
|
|
00
|
|
|
#9 |
|
Membre habitué
![]() Inscription : juin 2004 Messages : 296 ![]() |
Bonjour,
Merci de votre réponse. J'ai effectivement pensé à utiliser un group by mais dans ce cas-là je ne vois vraiment pas dans quelle mesure il peut m'être utile. |
|
|
00
|
|
|
#10 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
oui effectivement j’ai peut être un peu lu trop vite la demande.
Que lest votre sgbd ? Ensuite est-ce que vouloir la ligne avec l'id max est pertinent (c'est une pk donc ..) ? Fonctionnellement ceci vous convient ? edit: surtout au vu de votre exemple, pour un même article : sta_id : 7, date : 12-02-2011 sta_id : 8, date : 11-02-2011 donc prendre le statut avec le sta_id le plus élevé correspond-il vraiment au résultat voulu ? |
|
|
00
|
|
|
#11 | |||
|
Membre habitué
![]() Robert LabrousseDéveloppeur décisionnel Inscription : février 2009 Messages : 79 ![]() |
Et quelque chose du genre ?
Code :
__________________
Citation:
|
|||
|
|
10
|
|
|
#12 | ||
|
Membre confirmé
![]() Développeur informatique Inscription : avril 2011 Messages : 196 ![]() |
Une petite modification sur la requete que j'avais proposé
Code :
|
||
|
|
00
|
|
|
#13 | |||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
Citation:
cette requête ne marchera pas. le sta_id le plus élevé pour un article n'est pas forcément celui qui à la date la plus grande. |
|||
|
|
00
|
|
|
#14 |
|
Membre habitué
![]() Inscription : juin 2004 Messages : 296 ![]() |
Bonjour,
Merci pour vos réponses. @punkoff : je suis sous MySQL @punkoff : fonctionnellement, c'est effectivement ce que je souhaite à savoir dans le cas où un article possède ses deux derniers statuts à la même date, prendre le statut qui a été inséré en dernier donc avec le sta_id le plus grand. @tfc3146 : merci, je vais partir sur ta solution. J'ai quand même peur de perfs étant donné que cela oblige à faire une sous-requête supplémentaire... mais si j'ai pas le choix.... Merci encore. |
|
|
00
|
|
|
#15 | ||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
la seule solution sans sous-requete serai d'avoir les fonctions de fenêtrage.
Mais c'est foutu pour MySql de ce côté là. et est-ce que quelque-chose dans ce genre là fonctionne ? (éviterai une 2eme sous-requete ) Code :
|
||
|
|
00
|
|
|
#16 |
|
Membre habitué
![]() Inscription : juin 2004 Messages : 296 ![]() |
@punkoff : je viens de tester et ta requête fonctionne bien.
Entre ces deux requêtes, laquelle est la plus performante ? |
|
|
00
|
|
|
#17 | ||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
je ne saurai répondre, il faudrai regarder les plans d'execution et les comparer (je n'ai pas mySql d'installé)
Niveau indexation pour la 2eme requête ça serait : Code :
|
||
|
|
00
|
|
|
#18 | |
|
Membre habitué
![]() Robert LabrousseDéveloppeur décisionnel Inscription : février 2009 Messages : 79 ![]() |
ORDER BY c'est lourd. Peut-être que si ta table n'est pas très grosse, tu ne verras pas senseiblement la différence en tant de réponse, mais là l'ORDER BY ne s'impose pas => il vaut mieux utiliser MAX.
__________________
Citation:
|
|
|
|
00
|
|
|
#19 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
|
|
|
00
|
|
|
#20 | ||
![]() ![]() |
Essayez aussi ainsi :
Code :
__________________
Email : http://scr.im/waldar |
||
|
00
|
Copyright © 2000-2012 - www.developpez.com