我的桌子是:
id home datetime player resource
---|-----|------------|--------|---------
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
我需要选择每个home
包含的最大值datetime
。
结果将是:
id home datetime player resource
---|-----|------------|--------|---------
1 | 10 | 04/03/2009 | john | 399
2 | 11 | 04/03/2009 | juliet | 244
5 | 12 | 04/03/2009 | borat | 555
8 | 13 | 01/01/2009 | borat | 700
我努力了:
-- 1 ..by the MySQL manual:
SELECT DISTINCT
home,
id,
datetime AS dt,
player,
resource
FROM topten t1
WHERE datetime = (SELECT
MAX(t2.datetime)
FROM topten t2
GROUP BY home)
GROUP BY datetime
ORDER BY datetime DESC
不起作用 尽管数据库保留187个,但结果集有130行home
。结果包括的一些重复项。
-- 2 ..join
SELECT
s1.id,
s1.home,
s1.datetime,
s1.player,
s1.resource
FROM topten s1
JOIN (SELECT
id,
MAX(datetime) AS dt
FROM topten
GROUP BY id) AS s2
ON s1.id = s2.id
ORDER BY datetime
不。提供所有记录。
-- 3 ..something exotic:
具有各种结果。
你好亲密!您需要做的就是选择住所及其最大日期时间,然后再加入到topten
两个字段的表中:
SELECT tt.*
FROM topten tt
INNER JOIN
(SELECT home, MAX(datetime) AS MaxDateTime
FROM topten
GROUP BY home) groupedtt
ON tt.home = groupedtt.home
AND tt.datetime = groupedtt.MaxDateTime
如果两个相等的最大日期时间位于同一家(具有不同的玩家)中,请对其进行测试,以进行区分
我认为经典的方法是使用自然连接:“ SELECT tt。* FROM topten tt NATURAL JOIN(SELECT home,MAX(datetime)AS datetime FROM topten GROUP BY home)最新;” 完全相同的查询,但更具可读性
如果两行的“ home”和“ datetime”字段值相同怎么办?
@Young查询的问题是它可能返回
id
,player
并且resource
给定房屋的非最大行数,例如home = 10,您可能会得到:3 | 10 | 04/03/2009 | john | 300
换句话说,它不能保证结果集中一行的所有列都属于到给定家的max(datetime)。您查询的@ me1111问题是,它可能/可能不会针对给定的房屋返回第max(datetime)行。原因是GROUP BY将为每个房屋获取任何随机行,而ORDER BY只会对GROUP BY产生的所有结果进行排序