Tricky Triple Sql Регистрация При поиске самой последней даты - PullRequest
0 голосов
/ 05 января 2019

Я прошу прощения, если этот вопрос был задан аналогичным образом ранее. Я довольно новичок в SQL, и мне очень трудно найти решение моей проблемы. Очень растерян.

У меня сейчас три таблицы:


Шаблоны - | id | имя |


Пользователи - | id | полное имя |


История изменений - | id | id_user | id_template | last_edited_at


У меня есть таблица, заполненная шаблонами.

У меня есть отдельная таблица, заполненная пользователями, которые вносят изменения в эти шаблоны. Каждый раз, когда вносится изменение, в таблице журнала изменений создается запись.

Я пытаюсь создать запрос, основной целью которого является получение КАЖДОЙ записи из шаблонов, а также КОГДА она была недавно изменена и ПО КОГО.

Я пришел с этим запросом, который позволяет мне найти самое последнее изменение для определенного идентификатора шаблона.

SELECT changelogs.id_user, changelogs.updated_at, users.full_name
FROM changelogs
JOIN users
ON changelogs.id_user = users.id
WHERE changelogs.id_template = :templateId
ORDER BY changelogs.updated_at DESC 
LIMIT 1

Я изначально пытался решить эту проблему, просматривая каждую запись шаблона и выполняя вышеуказанный запрос для каждого идентификатора записи, но это медленно и не работает. Я знаю, что должен быть способ сделать это в SQL, и я хотел посмотреть, решил ли кто-нибудь подобную проблему. Я не проектировал эту базу данных, извините, если она не оптимизирована.

Мой идеальный конечный результат - таблица, которая выглядит следующим образом:


| template.id | template.name | user.name | changelog.updated_at |

Большое спасибо заранее за любые рекомендации

Ответы [ 3 ]

0 голосов
/ 05 января 2019

Вы можете использовать два JOIN для получения информации из всех таблиц, а затем использовать SUBQUERY , чтобы получить максимальное значение для поля updated_at, например:

SELECT 
    t.id as template_id, t.name as template_name, 
    u.name as user_name, 
    c.updated_at as changelog_updated_at 
FROM 
    changelogs c

INNER JOIN templates t on c.id_template = t.id
INNER JOIN users u on c.id_user = u.id

WHERE 
  c.updated_at = 
    (SELECT MAX(updated_at) FROM changelogs c2 where c2.id_template = t.id)

ORDER BY t.template_name 
0 голосов
/ 05 января 2019

Я думаю, что оконная функция - ваш друг здесь. Я не раскручивал примеры таблиц, чтобы запустить его, поэтому я могу выбрать один или два типа:

select *
from (

    select *
        ,row_number() over (partition by t.id order by c.last_edited_at desc) row
        from Templates t
        left join ChangeLog c
        on t.id=c.id_template
        left join Users u
        on c.id_user=u.id

) t
where row=1
0 голосов
/ 05 января 2019

Вы можете использовать коррелированный подзапрос:

SELECT cl.id_user, cl.updated_at, u.full_name
FROM changelogs cl JOIN
     users u
     ON cl.id_user = u.id
WHERE cl.updated_at = (SELECT MAX(cl2.updated_at)
                       FROM changelogs cl2
                       WHERE cl2.id_template = cl.templateId
                      );

Для каждого шаблона, указанного во внешнем запросе, подзапрос находит максимальную дату обновления. Затем он используется для фильтрации записей во внешнем запросе.

...