最佳答案
我有一张球员表现表:
CREATE TABLE TopTen (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,home INT UNSIGNED NOT NULL,`datetime`DATETIME NOT NULL,player VARCHAR(6) NOT NULL,resource INT NOT NULL);
什么查询将为每个不同的home
返回其最大值datetime
的行?换句话说,我如何通过最大datetime
(按home
分组)进行过滤,并且仍然在结果中包含其他未分组的非聚合列(例如player
)?
对于此示例数据:
INSERT INTO TopTen(id, home, `datetime`, player, resource)VALUES(1, 10, '04/03/2009', 'john', 399),(2, 11, '04/03/2009', 'juliet', 244),(5, 12, '04/03/2009', 'borat', 555),(3, 10, '03/03/2009', 'john', 300),(4, 11, '03/03/2009', 'juliet', 200),(6, 12, '03/03/2009', 'borat', 500),(7, 13, '24/12/2008', 'borat', 600),(8, 13, '01/01/2009', 'borat', 700);
结果应该是:
id | 家 | datetime | 玩家 | 资源 |
---|---|---|---|---|
1 | 10 | 04/03/2009 | 约翰 | 399 |
2 | 11 | 04/03/2009 | 朱丽叶 | 244 |
5 | 12 | 04/03/2009 | 硼 | 555 |
8 | 13 | 01/01/2009 | 硼 | 700 |
我尝试了一个子查询,为每个home
获取最大datetime
:
-- 1 ..by the MySQL manual:
SELECT DISTINCThome,id,datetime AS dt,player,resourceFROM TopTen t1WHERE `datetime` = (SELECTMAX(t2.datetime)FROM TopTen t2GROUP BY home)GROUP BY `datetime`ORDER BY `datetime` DESC
结果集有130行,尽管数据库有187行,表明结果包括一些home
的重复项。
然后我尝试加入一个子查询,为每一行id
获取最大datetime
:
-- 2 ..join
SELECTs1.id,s1.home,s1.datetime,s1.player,s1.resourceFROM TopTen s1JOIN (SELECTid,MAX(`datetime`) AS dtFROM TopTenGROUP BY id) AS s2ON s1.id = s2.idORDER BY `datetime`
不。给所有的记录。
我尝试了各种异国情调的查询,每个查询都有不同的结果,但没有什么能让我更接近解决这个问题。