与您的查询的问题是,当您使用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