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

时间:2012-02-02 15:26:19

标签: mysql group-by distinct

我有一个包含三列的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

有人有任何想法吗?感谢

5 个答案:

答案 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;