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

Thi*_*ode 2 mysql join audit-tables greatest-n-per-group

可能的重复:
获取列具有最大值的行

我有一个人员审计表以及他们在特定时间戳拥有的股份数量。如何获取给定 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
Run Code Online (Sandbox Code Playgroud)

我想要的输出:

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
Run Code Online (Sandbox Code Playgroud)

我可以做这样的事情:

select a.* from audittable a join audittable b 
on a.id = b.id
where a.dateadded > b.dateadded;
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ski 5

您将需要一个子查询,但不需要子选择(这会对性能造成非常不利的影响)。

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
Run Code Online (Sandbox Code Playgroud)

这是关于 SQLfiddle 的演示

  • @ThinkCode 它显示所有列,但查看 http://sqlfiddle.com/#!2/5aa01/3 它将列出 12 个 id=1 的共享,当它应该列出 65 时。您不能只将其他列添加到选择列表。 (2认同)