Dans votre deuxième exemple vous utilisez un sous-requête corrélée. Vous pouvez utiliser une sous-requête non corrélée (table dérivée) à la place. Ce sera plus rapide si vous répertoriez tous les objets, car une sous-requête corrélée devrait être appelée une fois pour chaque ligne de la requête externe.
Voici un exemple en utilisant une table dérivée:
SELECT foo.*
FROM foo
JOIN (
SELECT MAX(Y) max_time, X
FROM foo
GROUP BY X
) d_foo ON (d_foo.X = foo.X AND
d_foo.max_time = foo.Y);
Cas de test:
INSERT INTO foo VALUES (1, '2010-01-01 12:00:00', '1');
INSERT INTO foo VALUES (1, '2010-01-03 12:00:00', '2');
INSERT INTO foo VALUES (2, '2010-01-05 12:00:00', '3');
INSERT INTO foo VALUES (2, '2010-01-02 12:00:00', '4');
INSERT INTO foo VALUES (3, '2010-01-08 12:00:00', '5');
INSERT INTO foo VALUES (4, '2010-01-03 12:00:00', '6');
INSERT INTO foo VALUES (4, '2010-01-04 12:00:00', '7');
Résultat:
+---+---------------------+------+
| X | Y | Z |
+---+---------------------+------+
| 1 | 2010-01-03 12:00:00 | 2 |
| 2 | 2010-01-05 12:00:00 | 3 |
| 3 | 2010-01-08 12:00:00 | 5 |
| 4 | 2010-01-04 12:00:00 | 7 |
+---+---------------------+------+
4 rows in set (0.02 sec)
Cependant, si vous serez toujours restreignez votre résultat juste un X
, vos solutions sont probablement bien. Consultez @Mark Byers' answer pour d'autres conseils à ce sujet.
la colonne Y est garantie unique par utilisateur? –
Deux clés primaires ne sont pas possibles dans une table – Murugesh
@Mark Byers: bien que Y soit très susceptible d'être unique, il n'est pas garanti car deux entrées peuvent avoir des horodatages identiques en théorie. – Scruffers