很抱歉,以前是否曾以类似方式提出过此问题。我对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 |
非常感谢您提供任何指导
答案 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