如何从MySQL表中获取相同id的最新时间戳记录?

时间:2012-11-21 17:22:50

标签: mysql join greatest-n-per-group audit-tables

  

可能重复:
  Fetch the row which has the Max value for a column

我有一个人员审计表和他们在特定时间戳拥有的股票数量。如何获取给定ID的最新记录?

mysql审核表

id name shares  dateadded 
1  Abc  12      2012-10-06 12:18:21
2  Klm  23      2012-10-06 12:18:21
3  Jim  45      2012-10-06 12:18:21
1  Abc  35      2012-11-06 12:18:21
1  Abc  65      2012-11-17 12:18:21
2  Klm  13      2012-11-06 12:18:21

我想要的输出:

id name shares  dateadded 
1  Abc  65      2012-11-17 12:18:21
2  Klm  13      2012-11-06 12:18:21
3  Jim  45      2012-10-06 12:18:21

我可以这样做:

select a.* from audittable a join audittable b 
on a.id = b.id
where a.dateadded > b.dateadded;

但这只给了我那些重复的最新记录。在这种情况下,ids 1,2而不是3.如何在没有子查询或临时表的情况下获取所有ID的最新记录列表?

2 个答案:

答案 0 :(得分:4)

您需要一个子查询,但不是子选择(性能受到很大影响)。

JOIN针对返回idMAX(dateadded)聚合的子查询。需要子查询连接才能匹配包含最新时间戳的行中的所有其他列值。

SELECT
  audittable.id,
  name,
  shares,
  audittable.dateadded
FROM
  audittable
  /* Subquery returns id dateadded grouped by id */
  JOIN (
    SELECT id, MAX(dateadded) AS dateadded FROM audittable GROUP BY id
    /* JOIN condition is on both id and dateadded between the two tables */
  ) maxtimestamp ON audittable.id = maxtimestamp.id AND audittable.dateadded = maxtimestamp.dateadded

Here is a demonstration on SQLfiddle

答案 1 :(得分:2)

如果没有子查询,则仅限于此

SELECT id, MAX(dateAdded)
FROM audittable
GROUP BY id

如果你想要其他列,你需要像Michael Berkowski的回答那样的子查询