[Résolu]Requete selection d'historique

Requete selection d'historique [Résolu] - SQL/NoSQL - Programmation

Marsh Posté le 13-06-2007 à 11:53:26    

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
Reply

Marsh Posté le 13-06-2007 à 11:53:26   

Reply

Marsh Posté le 13-06-2007 à 12:06:16    

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...

Reply

Marsh Posté le 13-06-2007 à 12:09:26    

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
Reply

Marsh Posté le 13-06-2007 à 12:18:44    

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...

Reply

Marsh Posté le 13-06-2007 à 12:24:01    

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!

Reply

Marsh Posté le 13-06-2007 à 12:48:55    

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!

Reply

Marsh Posté le 13-06-2007 à 13:23:56    

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

Reply

Marsh Posté le 13-06-2007 à 13:55:15    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed