用于获取 ID1 的最新条目的 SQL 查询

Posted

技术标签:

【中文标题】用于获取 ID1 的最新条目的 SQL 查询【英文标题】:SQL query for fetching latest entry for ID1 【发布时间】:2016-04-25 23:14:32 【问题描述】:

我有一个具有以下属性的架构:

    ID1 ID2 更新日期时间

此架构的主键是 ID1,ID2。我需要为给定的 ID1 找到 ID2 的值。 ID2 将有多个值。我需要一个可以使用“更新日期时间”获取的最新时间。

我有一个 ID1 列表,我需要在一个查询中找到对应的 ID2。

我可以做到,使用两个查询。首先按 ID1 分组并获取 ID1 的最大日期时间。然后获取该“日期时间”值的 ID2(我们可以假设“更新日期时间”对于所有条目都是唯一的)。

但我在想是否可以在单个查询中做到这一点。

我正在使用 mysql

【问题讨论】:

@a_horse_with_no_name MySQL。更新了问题。 【参考方案1】:

试试这个:

    SELECT t0.ID1,t0.ID2,t0.Update_date_time
    FROM table AS t0
    LEFT JOIN table AS t1 ON t0.ID1=t1.ID1 AND t1.Update_date_time>t0.Update_date_time
    WHERE t1.ID1 IS NULL;

在小提琴中完成http://sqlfiddle.com/#!9/8e3879/8/0

【讨论】:

如果有 3 或 4 个选项怎么办? @sagi 你的意思是 3 或 4 个选项?如果有 id3 和 id4 您只需将它们选择出来,只要您希望按 ID1 分组并比较更新日期时间,如果您的意思是多个 update_date_time 那么您可能需要 row_number 来执行此操作 老派。不错 - 但比手册中记录的更现代的方法要慢 是的,我的意思是多个更新日期时间,因为有,他说。 @sagi 不,我不认为他说的是我不明白他想如何处理另一个日期时间类型列来选择最新或最早的,如果你遇到这样的情况你只是使用rownumber 按 id1 分区并按多个时间列排序。但它不能在 1 个简单查询中完成,至少您需要 1 个子查询【参考方案2】:

假设您的表名是 MYTABLE,我使用子查询来获取 ID2 值,每个 ID1 值使用 MAX(UPDATED)ID1 值作为逗号分隔值传递,显示为 LIST_OF_ID1s

下面的查询应该没问题:

SELECT * FROM MYTABLE T1 where T1.ID1 in (LIST_OF_ID1s)
AND T1.ID2 = 
 (SELECT T2.ID2 FROM MYTABLE T2 
  where T1.ID1 = T2.ID1 
  ORDER BY T2.UPDATED DESC LIMIT 1);

工作 SQL Fiddle 演示 here

【讨论】:

以上是关于用于获取 ID1 的最新条目的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

d6 增量查询 - 获取最新条目

MySQL查询从具有1000万行的表中获取每个条目的最新记录

从 SQL Server 全文索引中获取前 n 个最新条目

获取随机条目的 SQL 查询

MySQL 获取所有商店的最新条目

在单个 SQL 查询中获取两个下一个和两个上一个条目