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;
我的 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;