选择具有不同值和最大日期的行
我有一个包含三列的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字段,返回ID和ID2不匹配。对于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;
不知道,但根据你的榜样,试试这个:
select max(id) as Id,id2,max(someDate) from testMe group by Id2
比@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
的确如此,但我读过他的例子,并补充说明他正在努力完成什么。一旦我意识到这是不正确的,就没有时间删除我的答案。对不起 – Sparky 2012-02-02 16:15:16
select id2, max(id), max(somedate) from testme group by id2;
这不会在一般情况下工作 – itsmeee 2012-02-02 15:39:25
这只适用于这种情况,因为行号二有最大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
我没有很多的记录 - 这很好。谢谢 – wsams 2012-02-05 04:10:11