Tricky Triple Sql Join在查找最新日期时

时间:2019-01-05 00:12:53

标签: mysql sql database greatest-n-per-group database-administration

很抱歉,以前是否曾以类似方式提出过此问题。我对SQL比较陌生,很难找到解决问题的方法。非常困惑。

我目前有三个表:


模板-| id |名称|


用户-| id | full_name |


变更日志-| id | id_user | id_template | last_edited_at


我有一张桌子,上面放着模板。

我有一个单独的充满用户的表,这些用户可以在这些模板上进行更改。每次进行更改时,都会在changelog表中创建一个条目。

我正在尝试创建一个查询,其主要目标是从模板中获取每条记录,以及最近一次更改的时间,以及通过WHOM。

我想到了这个查询,使我能够找到特定模板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 |用户名| changelog.updated_at |

非常感谢您提供任何指导

3 个答案:

答案 0 :(得分:0)

您可以使用相关子查询:

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

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

答案 1 :(得分:0)

您可以使用两个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 

答案 2 :(得分:0)

我认为窗口功能是您的朋友。我没有启动示例表来运行它,所以我有一两个O型:

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