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

Posted

技术标签:

【中文标题】如何从 MySQL 表中获取相同 id 的最新时间戳记录? [复制]【英文标题】:How to fetch the most recent timestamped record for the same id from MySQL table? [duplicate] 【发布时间】:2012-11-10 00:35:42 【问题描述】:

可能重复: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;

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

【问题讨论】:

这是一个理论问题吗?为什么不是子查询? @Michael 的答案可能是最快的方法,有适当的索引。 根本不是理论上的。我想的不对! Marc 之前的回答也适用 select a.*, max(dateadded) from audittable group by id;不是吗? 比尔,可能。我觉得我的问题很清楚,供其他人阅读和理解。另一个链接是 Oracle 的。 【参考方案1】:

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

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

如果您想要其他列,则需要像 Michael Berkowski's answer 这样的子查询

【讨论】:

哦,我明白了。好吧,没有子查询我不知道 这与 OP 的期望输出不匹配。【参考方案2】:

您将需要一个子查询,而不是子选择(对性能有非常负面的影响)。

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

【讨论】:

操作不需要子查询 马克,我完全没想到。您之前的解决方案工作得很好。我对 Max 和 Groupby 很满意。只要我根据最近的时间戳获取所有记录(重复或不重复)一次。 没有因为我只按 id 分组。所以你不能有其他列,除非你使用这个答案中的子查询 @ThinkCode 因为它只返回 id 和 date added,而不是其他值。如果您只是将其他值添加到 SELECT 列表中,您将无法确定性地获得正确的份额。 mysql 将允许您这样做(其他 RDBMS 不允许),但结果并不总是正确的。 @ThinkCode 它显示所有列,但查看sqlfiddle.com/#!2/5aa01/3 它将列出 12 个 id=1 的共享,而它应该列出 65 个。您不能只将其他列添加到 SELECT 列表中。

以上是关于如何从 MySQL 表中获取相同 id 的最新时间戳记录? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 从两个不同的表中获取 user_id 和密码的查询

如何从 MySQL/Mariadb 获取用户 ID?

如何从 MySQL (MardiaDB) 依赖表中的最新记录中获取信息?

MySQL SQL 获取表中的最新记录?

如何使用会话ID从php mysql中的两个或多个表中获取值

从具有特定根的 SQL 表中获取最新分支的最有效方法是啥?