Tricky Triple Sql 在查找最近日期时加入
Tricky Triple Sql Join While finding the most recent date
如果之前有人以类似的方式问过这个问题,我深表歉意。我是 SQL 的新手,很难找到问题的解决方案。很困惑。
我目前有三个 table:
模板 - |编号 |姓名 |
用户 - |编号 | full_name |
变更日志 - |编号 | id_user | id_template | last_edited_at
我有一个 table 装满了模板。
我有一个单独的 table 用户,他们对这些模板进行了更改。每次进行更改时,都会在更改日志中创建一个条目 table。
我正在尝试创建一个查询,其主要目标是从模板中获取每条记录,以及它最近更改的时间和更改者。
我想到了这个查询,它允许我找到特定模板 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 中一定有办法做到这一点,我想看看是否有人解决了类似的问题。这个数据库不是我设计的,如果没有优化,请见谅。
我理想的最终结果是 table 看起来像:
| template.id | template.name | user.name | changelog.updated_at |
非常感谢您的指导
您可以使用相关子查询:
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
);
对于外部查询中引用的每个模板,子查询查找最大更新日期。然后用于过滤外部查询中的记录。
您可以使用两个 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
我认为 window 函数是您的朋友。我没有将示例表旋转到 运行 这个,所以我有一两个类型:
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
如果之前有人以类似的方式问过这个问题,我深表歉意。我是 SQL 的新手,很难找到问题的解决方案。很困惑。
我目前有三个 table:
模板 - |编号 |姓名 |
用户 - |编号 | full_name |
变更日志 - |编号 | id_user | id_template | last_edited_at
我有一个 table 装满了模板。
我有一个单独的 table 用户,他们对这些模板进行了更改。每次进行更改时,都会在更改日志中创建一个条目 table。
我正在尝试创建一个查询,其主要目标是从模板中获取每条记录,以及它最近更改的时间和更改者。
我想到了这个查询,它允许我找到特定模板 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 中一定有办法做到这一点,我想看看是否有人解决了类似的问题。这个数据库不是我设计的,如果没有优化,请见谅。
我理想的最终结果是 table 看起来像:
| template.id | template.name | user.name | changelog.updated_at |
非常感谢您的指导
您可以使用相关子查询:
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
);
对于外部查询中引用的每个模板,子查询查找最大更新日期。然后用于过滤外部查询中的记录。
您可以使用两个 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
我认为 window 函数是您的朋友。我没有将示例表旋转到 运行 这个,所以我有一两个类型:
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