Запрос SQL для получения последнего статуса загруженного файла, возможно, с использованием подзапроса - PullRequest
0 голосов
/ 19 июня 2020

Мне нужно написать запрос, который, как мне кажется, потребует в нем подзапроса. В настоящее время я пишу запрос как необработанный оператор SQL с использованием DataGrip, и мне нужно будет работать на сервере postGres. Я использую Laravel, чтобы написать приложение, в котором этот запрос должен работать.

Две таблицы, необходимые для записи запроса: media_files и статусы . Между двумя таблицами существует связь: media_files.id = statuses.model_id

Файлы хранятся в media_files и могут иметь два статуса: в ожидании и * 1013. * прикреплен. Статусы файлов хранятся в статусах . Таблица статусов может также содержать статусы других вещей, таких как задачи, события, пользователи и т. Д. c.

Мне нужен способ получить все файлы, где последний статус для них в ожидании. Некоторые файлы могут даже не иметь статуса в ожидании , и их можно игнорировать.

Таблица статусов может содержать несколько статусов одного и того же файла мультимедиа. Так, например, у вас может быть:

Запись 1

media_files.id = 1

media_files.name = 'CV document'

statuses.id = 2

statuses.model_id = 1

statuses.model_type = 'App \ MediaFile'

statuses.name = 'connected'

statuses.created_at = '2020-06-16 17: 39: 08'

Запись 2

media_files.id = 1

media_files.name = 'CV document'

statuses.id = 1

statuses.model_id = 1

statuses.model_type = 'App \ MediaFile'

statuses.name = 'pending'

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;

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

вы также можете использовать функцию analyti c

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
0 голосов
/ 19 июня 2020

Вы можете использовать условное агрегирование, чтобы определить, является ли последний ожидающий статус последним статусом:

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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...