與您的查詢的問題是,當您使用GROUP BY
時,您必須爲不在GROUP BY
子句中的字段指定聚合函數。
你可能想嘗試,而不是以下:
SELECT u.*
FROM users u
INNER JOIN (
SELECT xName, MAX(xDatetime) max_time
FROM users
GROUP BY xName
) sub_u ON (sub_u.xName = u.xName AND
u.xDateTime = sub_u.max_time);
上面的查詢可以測試如下:
CREATE TABLE users (id int, xName varchar(100), xDateTime datetime);
INSERT INTO users VALUES (1, 'a', '2010-03-11 00:00:00');
INSERT INTO users VALUES (2, 'a', '2010-03-11 01:00:00');
INSERT INTO users VALUES (3, 'a', '2010-03-11 02:00:00');
INSERT INTO users VALUES (4, 'b', '2010-03-11 01:00:00');
INSERT INTO users VALUES (5, 'b', '2010-03-11 02:00:00');
INSERT INTO users VALUES (6, 'b', '2010-03-11 03:00:00');
INSERT INTO users VALUES (7, 'c', '2010-03-11 06:00:00');
INSERT INTO users VALUES (8, 'c', '2010-03-11 05:00:00');
-- Query Result:
+----+-------+---------------------+
| id | xName | xDateTime |
+----+-------+---------------------+
| 3 | a | 2010-03-11 02:00:00 |
| 6 | b | 2010-03-11 03:00:00 |
| 7 | c | 2010-03-11 06:00:00 |
+----+-------+---------------------+
如果您想訂購由max_time
場的結果集,只需在查詢結尾添加ORDER BY u.xDateTime DESC
即可。你
我們需要看到您選擇的列。 – 2010-03-11 21:35:53
不要使用select *,這是你的問題,你必須告訴它什麼時候分組記錄。無論如何,選擇*是一個糟糕的做法。它不應該出現在生產代碼中。 – HLGEM 2010-03-11 21:41:02
讓我猜猜:MySQL?我還沒有看到另一個SQL服務器,它允許你用'GROUP BY'子句'SELECT *'。另一方面,MySQL假定您想在所有不是聚合的列上分組。 – Powerlord 2010-03-11 21:42:06