SQL 获取最新版本 table 并按其他 table 的名称变量排序的查询

SQL Query that gets latest version of table and sorted by other table's name variable

我的 sql 中有两个 table,一个是部署,另一个是应用程序。我正在尝试获取最新版本(它是根据 update_at 变量计算的)并且我想按应用程序名称对其进行排序。 app_id 在部署 table 中等于应用程序中的 id table。应用程序中的一行 table 可以在部署中多行部署 table 这意味着它们具有一对多关系。

Deployment table
id
app_id
version
created_at
updated_at

Application table:
id
name
created_at
updated_at
image

我是这样写的,但是没有用。有人可以帮助我吗?

SELECT d.*
FROM deployments d
INNER JOIN
(SELECT de.app_id, MAX(de.updated_at) AS MaxDateTime FROM deployments de, applications a GROUP BY de.app_id ORDER BY a.name) grouped_deployments
ON d.app_id = grouped_deployments.app_id
AND d.updated_at = grouped_deployments.MaxDateTime

如果您想要每个应用程序的最后一次部署,您可以将 IN 与聚合子查询一起使用:

select * 
from applications a
join deployments d on d.app_id = a.id
where (d.app_id, d.updated_at) in
(
  select app_id, max(updated_at)
  from deployments
  group by app_id
)
order by a.name;

如果您只需要每个应用程序的最新版本,相关子查询就足够了:

select 
    a.*,
    (
        select d.version 
        from deployments d 
        where d.app_id = a.id 
        order by d.updated_at desc 
        limit 1
    ) last_version
from applications a
order by a.app_name

如果您在 deployments(app_id, updated_at, version) 上有索引,这应该是一个有效的解决方案。

如果您想要 deployments table 中的更多列,那么一个选项是 join 并使用相关子查询进行过滤:

select a.app_name, d.version, d.updated_at, d.created_at
from applications a
inner join deployments d on d.app_id = a.id
where d.updated_at = (
    select max(d1.updated_at) from deployments d1 where d1.app_id = a.app_id
)
order by a.app_name
SELECT de.*
FROM application a
INNER JOIN
(SELECT d.app_id, MAX(d.updated_at) AS MaxDateTime FROM deployments d GROUP BY d.app_id) de
on de.app_id = a.id
order by a.name;

编辑多列: mysql 的旧版本允许 select 列表中的非聚合列。在较新的版本 (5.7+) 中,您可以删除 sql 模式“only_full_group_by”以获得相同的效果。现在,您可以添加派生的 table.

中的所有列

如果要portable查询,需要join back得到结果:

SELECT d.*
FROM application a
INNER JOIN
(SELECT d.app_id, MAX(d.updated_at) AS MaxDateTime FROM deployments d GROUP BY d.app_id) de
on de.app_id = a.id
INNER JOIN deployments d
ON d.updated_at = de.update_at
order by a.name;