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的unionleft join right join inner join和视图学习