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