我有一个包含三列的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 |
+----+-----+---------------------+
想要与每个ID2的最大日期匹配的ID
有人有任何想法吗?感谢
答案 0 :(得分:8)
这个查询肯定会有用,虽然它可能不是最佳的:
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;
答案 1 :(得分:1)
解决问题的另一种方法:
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行为。
答案 2 :(得分:1)
如果要在一组记录中获取最大日期,则不建议将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
答案 3 :(得分:-1)
不确定,但根据您的示例,请尝试以下方法:
select max(id) as Id,id2,max(someDate) from testMe group by Id2
答案 4 :(得分:-1)
select id2, max(id), max(somedate) from testme group by id2;