Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1555 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [Résolu]Requete selection d'historique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu]Requete selection d'historique

n°1574288
saymons
Posté le 13-06-2007 à 11:53:26  profilanswer
 

Bonjour à tous et à toutes,
 
J'ai un gros problème, je lutte assez violement dessus :
Mes tables :
 
histo
--------------
id
date
etat
commentaire
variation
asset_id
user_id
 
assets
--------------
id
name
type
 
Mon problème :
histo.variation peut prendre 3 valeurs : 0,1 ou 2
Je dois selectionner les element les plus récents de chaque asset pour avec les variations 0, 1 et 2, avec le nom et le type de chaque asset :
 
resultat voulu
-------------------
assets.type
assets.name
assets.id
assets.user_id
histo.date
histo.etat
histo.commentaire
histo.variation
 
Le point noir de la situation :  
J'ai une requête qui me donne toutes le infos, mais avec des doublons sur les variations lorsque state prend une valeur différente de la précédente.
 

Code :
  1. SELECT
  2. assets.type,
  3. assets.id,
  4. assets.name,
  5. histo.variation,
  6. MAX(histo.date),
  7. histo.state
  8. FROM
  9. histo RIGHT JOIN assets
  10. ON histo.asset_id=assets.id
  11. WHERE assets.type=1
  12. GROUP BY
  13. histo.variation,
  14. assets.type,
  15. assets.id,
  16. assets.name,
  17. histo.state
  18. ORDER BY
  19. assets.type,
  20. assets.id,
  21. assets.variation


 
Malheuresment, j'ai ces doublons qui m'ennuient beaucoup.
Je n'ai pas envie de faire une table contenant les derniers états de chaque variation de chaque asset... je trouve pas ça super clean.
 
Si quelqu'un a tout pigé à ce problème et peut m'aider, ce serait super cool!
 
Merci d'avance!


Message édité par saymons le 13-06-2007 à 14:22:57
mood
Publicité
Posté le 13-06-2007 à 11:53:26  profilanswer
 

n°1574302
rufo
Pas me confondre avec Lycos!
Posté le 13-06-2007 à 12:06:16  profilanswer
 

ajouter "GROUP BY assets.id" à la fin de ta requête. T'auras plus qu'1 ligne par asset mais t'aura aussi plus qu'une valeur pour la variation. C'est normal, d'avoir plusieurs lignes puisque pour un asset, tu remontes plusieurs lignes de histo...

n°1574306
anapajari
s/travail/glanding on hfr/gs;
Posté le 13-06-2007 à 12:09:26  profilanswer
 

AMA et si j'ai tout compris, t'es obligé de passer par une sous requête.
Quelque chose dans le genre:

Code :
  1. select
  2.   A.type,
  3.   A.name,
  4.   A.id,
  5.   H.user_id,
  6.   MA.mdate,
  7.   H.state,
  8.   H.commentaire,
  9.   MA.variation
  10. from
  11.               assets A
  12. inner join 
  13.      (
  14.    select
  15.      max(date) as mdate,
  16.      variation,
  17.      asset_id
  18.    from
  19.      histo
  20.    group by
  21.      variation,
  22.      asset_id
  23.      ) as MA
  24.  on MA.asset_id = A.id
  25. inner join histo H
  26.    on H.asset_id = A.id and H.date=MA.mdate and H.variation = MA.variation
  27. where
  28. ...
 

edit: Pour que cela marche correctement il faut au choix que:
 

  • date ne soit pas de type date mais de type timestamp

  • il y ait un et un seul enregistrement par asset_id/variation/date


Dans le cas contraire le jointure sur histo pourra toujours potentiellement remonter plus de lignes qu'il n'en faut


Message édité par anapajari le 13-06-2007 à 12:11:54
n°1574322
saymons
Posté le 13-06-2007 à 12:18:44  profilanswer
 

En fait le souci c'est que genre j'ai ça qui apparait
assets.type    assets.name   assets.id    assets.user_id           histo.date              histo.etat    histo.commentaire    histo.variation  
------------------------------------------------------------------------------------------------------------------
............
      1                   TEST           1                  1            2007-06-12 12:01:20         10                  NULL                   2
      1                   TEST           1                  1            2007-06-12 17:32:41         20                  NULL                   2
............
 
Alors que je n'ai besoin que de la deuxième ligne...

n°1574328
saymons
Posté le 13-06-2007 à 12:24:01  profilanswer
 

merci anapajari,
 
Ta requête est au poil, il me faudrait juste que même les assets qui n'ont pas de state enregistré ressortent avec les champs histo à NULL, et ce serait magique!
 
encore merci!

n°1574335
saymons
Posté le 13-06-2007 à 12:48:55  profilanswer
 

saymons a écrit :

merci anapajari,
 
Ta requête est au poil, il me faudrait juste que même les assets qui n'ont pas de state enregistré ressortent avec les champs histo à NULL, et ce serait magique!
 
encore merci!


 
Je crois avoir trouvé la soluce :

Code :
  1. select
  2.      A.type,
  3.      A.name,
  4.      A.id,
  5.      H.user_id,
  6.      MA.mdate,
  7.      H.state,
  8.      H.commentaire,
  9.      MA.variation
  10.     from
  11.                  assets A
  12.     right join 
  13.                 (
  14.                     select
  15.                       max(date) as mdate,
  16.                       variation,
  17.                       asset_id
  18.                     from
  19.                       histo
  20.                     group by
  21.                       variation,
  22.                       asset_id
  23.                       ) as MA
  24.             on MA.asset_id = A.id
  25.     left join histo H
  26.       on H.asset_id = A.id and H.date=MA.mdate and H.variation = MA.variation


 
ça me retourne la totalité des assets, et après je peux même filtrer traquilou par type.
 
Si jamais ya une éventualité que ma modif soit pas si opé que ça, faites moi signe!
Merci!

n°1574357
anapajari
s/travail/glanding on hfr/gs;
Posté le 13-06-2007 à 13:23:56  profilanswer
 

nan changer la jointure est ce qu'il fallait mais j'aurais changé les deux en left outer du coup.

n°1574377
MagicBuzz
Posté le 13-06-2007 à 13:55:15  profilanswer
 

moi j'aurai utilisé une solution similaire à celle d'anapajari, mais sans faire une jointure. juste une égalité sur la sous-requête, mais ça doit revenir au même.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [Résolu]Requete selection d'historique

 

Sujets relatifs
[c++]copie d'une chaine de caractere[Resolu][Résolu]Programme supprimant les commentaires d'un fichier C
[SQL Server 2005] Accès au donnée par requete SQL en VB[Résolu] Récuperer des valeurs entrées dans une boite de dialogue
Génération de fichier xml à partir de php mysql. [Résolu]requete php
une requete avec UNIONrequète sql de selection avec paramètre d'une autre table
[ACCESS] requete SQL max date 
Plus de sujets relatifs à : [Résolu]Requete selection d'historique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR