在第二個例子中,你正在使用相關子查詢。您可以使用不相關的子查詢(派生表)。如果您碰巧列出所有的foos,這會更快,因爲對於外部查詢的每一行,必須調用一次相關子查詢一次。
這是一個使用派生表的例子:
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);
測試用例:
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');
結果:
+---+---------------------+------+
| 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)
不過,如果你總是會限制你的結果只有一個X
,你的解決方案可能很好。查看@Mark Byers' answer瞭解更多關於此的提示。
爲Y保證爲每個用戶唯一的列? – 2010-08-31 11:30:42
兩個主鍵在表中是不可能的 – Murugesh 2010-08-31 11:33:15
@Mark Byers:儘管Y很可能是唯一的,但它不能保證,因爲兩個條目在理論上可能具有相同的時間戳。 – Scruffers 2010-08-31 11:37:39