我正在制作应用程序更新程序的后端,并使用我的服务器来跟踪所有文件和修订。
目前我的数据库中有两个表:
dev_version_control_files
Columns: FileID, FileName
dev_version_control_versions
Columns: VersionID, FileID, Version, DateReleased, FileLocation
files表为每个受版本控制的文件保留一条记录。版本表为每个文件的每个版本保留一条记录,以及发布日期,版本号和位置。
现在我想要的是获取files表中每个文件的最后一条记录(更新)。这应该由date字段决定,该字段保存从发布时开始的unix时间戳。
每次发出更新请求时,我都不想遍历版本表中的每一行,那么可以在一个查询中执行此操作吗?
答案 0 :(得分:4)
我不是SQL专家,但这会有用吗?
SELECT f.*, v.DateReleased
FROM dev_version_control_files f
INNER JOIN (
SELECT FileId, MAX(DateReleased) AS DateReleased
FROM dev_version_control_versions
GROUP BY 1) v ON f.FileID = v.FileID
我现在要在示例表上对此进行测试以查看(我认为某些语法可能已关闭),但我们的想法是从versions
表中提取最大日期并按ID分组,然后加入ID上的files
表。这是你在做什么的吗?
答案 1 :(得分:4)
您需要先获得每个DateReleased
的{{1}}的最大值FileID
之后加入dev_version_control_files
和dev_version_control_versions
SELECT a.*, b.Version, DateReleased
FROM dev_version_control_files a
INNER JOIN dev_version_control_versions b
on a.FileID = b.FileID
INNER JOIN
(
SELECT FileID, MAX(DateReleased) MaxDate
FROM dev_version_control_versions
GROUP BY FileID
) c ON b.FileID = c.FileID AND
b.DateReleased = c.MaxDate
答案 2 :(得分:1)
假设您在第二个表中至少有一个版本记录:
SELECT FileID, FileName, MAX(DateReleased)
FROM dev_version_control_files
INNER JOIN dev_version_control_versions ON FileID
GROUP BY FileID, FileName
这不是确切的SQL,它是我如何处理这个问题的粗略想法。