在查找最新日期时使用复杂的三重sql连接

92dk7w1h  于 2021-06-15  发布在  Mysql
关注(0)|答案(3)|浏览(419)

如果以前也有人以类似的方式问过这个问题,我深表歉意。我对sql比较陌生,很难找到解决问题的方法。非常困惑。
我现在有三张table:
模板-| id |名称|
用户-| id |全名|
更改日志-| id | id |用户| id |模板|上次编辑时间|
我有一张满是模板的table。
我有一个单独的表,其中充满了对这些模板进行更改的用户。每次进行更改时,都会在changelog表中创建一个条目。
我正在尝试创建一个查询,主要目标是从模板中获取每条记录,以及最近更改的时间和更改者。
我提出了这个查询,它允许我查找特定模板id的最新更改。

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

我最初尝试通过循环遍历每个模板记录来解决这个问题,并对每个记录id运行上述查询,但这很慢,而且不起作用。我知道在sql中一定有办法做到这一点,我想看看是否有人解决了类似的问题。我没有设计这个数据库,所以很抱歉,如果它没有优化。
我理想的最终结果是一张表,看起来像:
|template.id | template.name | user.name | changelog.updated |位于|
非常感谢您的指导

bqjvbblv

bqjvbblv1#

您可以使用两个联接从所有表中获取信息,然后使用子查询获取更新的\u 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
tcbh2hod

tcbh2hod2#

可以使用相关子查询:

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
                      );

对于外部查询中引用的每个模板,子查询将查找最长更新日期。然后用它来过滤外部查询中的记录。

lvmkulzt

lvmkulzt3#

我认为窗口函数是你的朋友。我没有旋转示例表来运行此操作,因此可能会有一个或两个类型:

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

相关问题