Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 获取表的最新版本并按其他表的名称变量排序的SQL查询_Mysql_Sql_Database_Join_Subquery - Fatal编程技术网

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

Mysql 获取表的最新版本并按其他表的名称变量排序的SQL查询,mysql,sql,database,join,subquery,Mysql,Sql,Database,Join,Subquery,我的sql中有两个表,一个是部署表,另一个是应用程序表。我正在尝试获取最新版本,它是根据update_at变量计算的,我想按应用程序名称对它们进行排序。部署表中的应用程序id等于应用程序表中的id。应用程序表中的一行可以包含部署表中的多个部署行,这意味着它们之间存在一对多关系 Deployment table id app_id version created_at updated_at Application table: id name created_at updated_at imag

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

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

如果希望每个应用的最后一次部署,可以将中与聚合子查询一起使用:

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.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 
    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
这应该是一个有效的解决方案,前提是您有一个关于deploymentsapp_id、updated_at、version的索引

如果希望从deployments表中获得更多列,则可以使用关联子查询进行联接和筛选:

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.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
编辑多个列: mysql的旧版本允许在选择列表中使用非聚合列。在较新版本5.7+中,您可以仅删除sql模式\u full\u group\u by以获得相同的效果。现在,您可以在派生表中添加所有列

如果需要可移植查询,则需要连接回以获得结果:

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;

逗号分隔连接是20世纪80年代的遗物。那是在MySQL发明之前。你为什么用这个?为什么要交叉加入部署和应用程序?那一定是个错误,对吧?你用的是什么MySQL版本?对不起,我记得我的课上讲过,所以我试着用它。版本isMySQL 5.7,我无法更改它,因为它不是个人项目。好的,所以这可能是一个错误的类:-使用显式连接,而不是内部连接|左连接|交叉连接。在您的情况下,您根本不需要加入,但如果您愿意,您可以加入。请看我的答案。是的,我想要最新的版本,但我也想按名称排序,这是应用程序表中的变量。Applications表和Deployment表分别用id和app_id连接。然后只需连接application表并添加所需的ORDER BY。我已经相应地更新了我的答案。我得到一个错误,上面写着错误代码:1052。/ALL/ANY子查询中的“updated_at”列不明确:这是因为两个表都有一个名为updated_at的列。添加联接时,我只是忘记了用表名限定列。您应该学会理解错误消息。那么你就可以自己发现并修复这个问题了。我已更新答案。部署表没有名为app_name/name的变量。它属于应用程序表。@meursault:是的,查询会考虑到这一点。您可能需要刷新页面以获取最新版本的答案。我正在查看活动答案,结果是这样的:order by d.app_name对我不起作用:@meursault:我的错,它必须是order by a.app_name。修正了。@meursault:这不是你原来问题的一部分,只是说你想要最新的版本。。。请参阅我的更新答案。它正在工作,但是否也可以从部署中获取版本、创建时间和id列?它只在列中打印应用程序id和更新的应用程序id。我试图在内部选择中写入它,但它给出了错误