mysql—一个sql查询,用于获取可能使用子查询上载的文件的最后状态

vpfxa7rd  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(248)

我需要写一个查询,我想它需要一个子查询。目前,我正在使用datagrip将查询编写为原始sql语句,并且需要在postgres服务器上工作。我使用laravel来编写这个查询需要在其中工作的应用程序。
写入查询所需的两个表是媒体文件和状态。这两个表之间有一个链接:media\u files.id=statuses.model\u id
文件存储在媒体文件中,可以有两种状态:挂起和附加。文件的状态存储在状态中。状态表还可以包含其他事物的状态,如任务、事件、用户等。
我需要一种方法来获取所有文件的最后一个状态是挂起。有些文件甚至可能没有挂起状态,可以忽略这些文件。
状态表可以保存同一媒体文件的多个状态。例如,你可以有:
记录1
媒体\u files.id=1
media\u files.name='简历文档'
statuses.id=2
statuses.model_id=1
statuses.model_type='应用程序\媒体文件'
statuses.name='附加'
statuses.created_at='2020-06-16 17:39:08'
记录2
媒体\u files.id=1
media\u files.name='简历文档'
statuses.id=1
statuses.model_id=1
statuses.model_type='应用程序\媒体文件'
statuses.name='挂起'
statuses.created_at='2020-06-14 17:30:00'
我已经开始了查询,但它似乎工作不正常:

select media_files.*, (
    select name
    from statuses
    where model_id = media_files.id
      and model_type = 'App\File'
    order by statuses.created_at desc
    limit 1
)
as latest_status
from media_files
inner join statuses on statuses.model_id = media_files.id
where statuses.model_type = 'App\Entities\Media\File'
order by media_files.id desc;
fae0ux8s

fae0ux8s1#

您可以使用条件聚合来确定最后一个挂起状态是否为最后一个状态:

select mf.*
from media_files mf join
     (select s.model_id,
             max(case when s.status = 'pending' then s.created_at end) as last_pending_created_at,
             max(s.created_at) as last_created_at
      from statuses s
      group by s.model_id          
     ) s
     on s.model_id = mf.id
where last_pending_created_at = last_created_at;

也可以使用相关子查询:

select mf.*
from (select mf.*,
             (select s.status
              from statuses s
              where s.model_id = mf.id
              order by s.created_at desc
              limit 1
             ) as last_status
      from media_files mf
     ) mf
where last_status = 'pending';
atmip9wb

atmip9wb2#

你也可以使用解析函数

SELECT MEDIA_FILES.*,LATEST_STATUS.* 
FROM 
(SELECT NAME,MODEL_ID,
MAX(CREATED_AT) OVER(PARTITION BY NAME) AS MAX_TM
WHERE MODEL_ID = MEDIA_FILES.ID
AND MODEL_TYPE = 'App\File') AS LATEST_STATUS,MEDIA_FILES
WHERE LATEST_STATUS.MODEL_ID=MEDIA_FILES.MODEL_ID

相关问题