MySQL INNER JOIN 仅选择第一个最新创建的行

Posted

技术标签:

【中文标题】MySQL INNER JOIN 仅选择第一个最新创建的行【英文标题】:MySQL INNER JOIN select only the first latest created row 【发布时间】:2020-03-01 00:27:44 【问题描述】:

我在发布前一整天都在尝试和搜索,但我无法弄清楚如何解决我的问题。

我有一张基本上像这样的桌子

ID | Name | RelatedTo | CreatedAt | Revision

基本上,这会跟踪文档名称及其内容,以及是否是哪个修订版本是 (0,1,2,3,...) 以及它是否与“父”文档相关(可选)。

文档可以有或没有修订

ID | Name | RelatedTo | CreatedAt | Revision
1  | A    |           | 2019-11-01| 0
2  | B    |           | 2019-11-01| 0
3  |      | 2         | 2019-11-04| 1

我是从这个post 开始的,但我无法让它适用于我的情况。

我需要选择主记录(例如 A 和 B)和最后一个 CreatedAt 字段(A 为 2019-11-01,B 为 2019-11-04)。

【问题讨论】:

我理解的两个 A 和 B 是如何相关的,3 属于 2,但 2 不属于 1。 请参阅:Why should I provide an MCRE for what seems to me to be a very simple SQL query? 并注意虽然最少,但 3 行很少足以具有代表性。 @nbk 文档可以有或没有修订 B (2) 有 (3) A(1) 没有。 AA 和 B 不相关,是不同的文件。谢谢 我在您的示例中添加了更多行,我只能看到存储过程中的递归循环,您应该添加名称而不使用相关列 @Hw.Master 对答案有何评论?他们中的任何一个对你有帮助吗?在提出问题后提供反馈会很高兴。 【参考方案1】:

您可以按名称对最大日期组使用子查询

select m.* 
from  my_table m
inner join  (
  select  name, max(reatedAt) max_date
  from   (
    select  name, createdAt
    from my_table 
    union 
    select m1.name, m2.createdAt
    from my_table m1 
   inner join  my_table m2 ON m1.id = me.RelatedTo
  ) t
  group by name
)  t ON t.name  = m.name 
      and t.max_date  = m.CreatedAt

【讨论】:

您的示例似乎只返回一条记录,即文档 A【参考方案2】:

这是你需要的:

select a.RelatedTo
       , max(a.name)
       ,  max(a.m) 
from (select RelatedTo
             , name
             , max(CreatedAt) m 
      from my_table 
      where RelatedTo is not null
      group by RelatedTo
               , name
      union all
      select id
             , name
             , max(CreatedAt) m 
      from my_table 
      where RelatedTo is null
      group by ID
            , name ) a
group by a.RelatedTo
order by a.RelatedTo

这里是DEMO

【讨论】:

以上是关于MySQL INNER JOIN 仅选择第一个最新创建的行的主要内容,如果未能解决你的问题,请参考以下文章

MySQL INNER JOIN 从其他表中只选择一行

mysql的unionleft join right join inner join和视图学习

使用 ORDER BY 和 INNER JOIN 优化 MySQL 查询(选择用户关注的位置)

使用 INNER JOIN 排除 MYSQL 查询结果

26.MySQL中的内连接INNER JOIN

如何在具有相同元素的两个 Python 列表上执行 MYSQL INNER JOIN?