Bonjour,

j'ai une table t1 qui contient les champs : employe , action , date sachant que chaque employe peut avoir plusieurs actions dans la table

id employe action date
---|--------- |-------- |---------
1 | aaaa1 | a1 | 2013-11-11 09:51:07
2 | aaaa1 | a2 | 2013-11-12 09:51:07
5 | bbbb2 | a1 | 2013-11-13 09:51:07
3 | cccc3 | a2 | 2013-11-14 09:51:07
4 | bbbb2 | a1 | 2013-11-15 09:51:07
5 | cccc3 | a2 | 2013-11-16 09:51:07
6 | bbbb2 | a1 | 2013-11-17 09:51:07
7 | aaaa1 | a1 | 2013-11-18 09:51:07

la requete que je cherche je veux retourner les employers que la derniere action qui ont fait est egale à une action précis exemple "a2"

J'ai mis

select * from t1 where action = "a2" group by action having max(date) = date

mais ne marche pas

Merci d'avance

2 réponses


Salut,

Je me demande pourquoi utiliser un max(), se serait pas plus optimiser de faire un

SELECT * FROM t1 WHERE action="a2" ORDER BY(date) DESC LIMIT 1

Ca devrait donc te faire le dernier enregistrement pour ton action spécifique.

Concernant l'impacte d'optimisation là mon skill est pas asser élevée :)

Bonjour,

Le order by est beaucoup plus lent. Order by triera plus de ranger (sauf s'il y a un index sur la colonne date). J'ai trouvé un exemple sur stackoverflow . J'ai adapté vite faite, mais ton code devrais ressembler à ça:

SELECT T.id, T.employe, T.action, T.date  FROM t1 AS T 
INNER JOIN (
    SELECT employe, max(date)  AS max(date)
    FROM t1
    GROUPE BY employe
)  Tm on T.employe = Tm.employe AND T.date = Tm.MaxDate
WHERE T.action = "a1"

Sinon la solution ne devrait plus être bien loin.

PS Pour augmenter la performance de cette requête, tu pourrais ajouter un index sur la colonne date. Ça va réduire la vitesse à l'insertion, mais l'augmenter pour la sélection. À toi de voir.