选择具有不同值和最大日期的行

问题描述:

我有一个包含三列的MySQL(5.1.49)表。选择具有不同值和最大日期的行

mysql> create table testme(id int auto_increment, id2 int not null, somedate datetime, primary key(id)); 

在我的情况ID2不是唯一的,但我想用不同的ID2与最大somedate返回行值。

以下是一些示例数据。

mysql> insert into testme values (1, 5, '2012-01-02 01:01:01'),(2, 5, '2012-02-02 02:02:02'),(3, 7, '2010-01-10 11:01:33'); 

question几乎回答我的,但额外的id字段,返回IDID2不匹配。对于id2 = 5,它返回id = 1而不是id = 2

mysql> select id, id2, max(somedate) from testme group by id2; 
+----+-----+---------------------+ 
| id | id2 | max(somedate)  | 
+----+-----+---------------------+ 
| 1 | 5 | 2012-02-02 02:02:02 | 
| 3 | 7 | 2010-01-10 11:01:33 | 
+----+-----+---------------------+ 

我很期待,

+----+-----+---------------------+ 
| id | id2 | max(somedate)  | 
+----+-----+---------------------+ 
| 2 | 5 | 2012-02-02 02:02:02 | 
| 3 | 7 | 2010-01-10 11:01:33 | 
+----+-----+---------------------+ 

想,对于匹配最大日ID每个ID2

没有人有任何想法,请?由于

该查询肯定会工作,虽然可能不是最优的:

select t.id, s.id2, s.somedate 
from testme t 
    join 
    (select id2, max(somedate) as somedate 
     from testme 
     group by id2 
    ) s 
    on s.id2 = t.id2 
    and s.somedate = t.somedate; 
+0

我没有很多的记录 - 这很好。谢谢 – wsams 2012-02-05 04:10:11

不知道,但根据你的榜样,试试这个:

select max(id) as Id,id2,max(someDate) from testMe group by Id2 
+0

比@triclosan回答同样的评论。如果你执行INSERT INTO testme(id,id2,somedate)VALUES(4,8,'2012-02-02 02:02:02'); INSERT INTO testme(id,id2,somedate)VALUES(5,8,'2010-01-02 01:01:01');'您的查询将返回'5,8,2012-02-02 02:02: 02'。 – 2012-02-02 15:58:54

+0

的确如此,但我读过他的例子,并补充说明他正在努力完成什么。一旦我意识到这是不正确的,就没有时间删除我的答案。对不起 – Sparky 2012-02-02 16:15:16

select id2, max(id), max(somedate) from testme group by id2; 
+1

这不会在一般情况下工作 – itsmeee 2012-02-02 15:39:25

+1

这只适用于这种情况,因为行号二有最大id和最大somedate。例如,如果第1行具有最大限度的日期,它将不起作用。 – 2012-02-02 15:47:50

的您的问题的替代解决方案:

SELECT t0.id, t0.id2, t0.somedate 
FROM testme AS t0 
LEFT JOIN testme AS t1 
    ON t0.id2 = t1.id2 
    AND t1.somedate > t0.somedate 
WHERE t1.id IS NULL; 

像@itsmeee的解决方案,如果id2, somedate对不是唯一的,它会带来两行:

+----+-----+---------------------+ 
| id | id2 | somedate   | 
+----+-----+---------------------+ 
| 4 | 8 | 2012-02-02 02:02:02 | 
| 6 | 8 | 2012-02-02 02:02:02 | 
+----+-----+---------------------+ 

如果id2, somedate双不是唯一的,由于某种原因,你需要每id2结果只有一个,你可以让MySQL使用额外的GROUP BY t0.id2子句为您选择一个。但要警告的是,这是非标准的SQL行为。

当要获取一组记录中的最大日期时,不建议将max(date)与其他行组合。当然,你总是会得到max(date),但其他领域将是该集合中的第一次出现。这里是一个回答你的问题,用你的表为例:

+----+-----+---------------------+ 
| id | id2 | somedate   | 
+----+-----+---------------------+ 
| 1 | 5 | 2012-01-02 01:01:01 | 
| 2 | 5 | 2012-02-02 02:02:02 | 
| 3 | 7 | 2010-01-10 11:01:33 | 
+----+-----+---------------------+ 
select id, id2, somedate from testme t1 
where somedate = 
(select max(somedate) from testme t2 where t2.somedate = t1.somedate) 
order by somedate desc