0

我目前正在制作应用程序更新程序的后端,并且我使用我的服务器来跟踪所有文件和修订。

目前我的数据库中有两个表:

dev_version_control_files
Columns: FileID, FileName

dev_version_control_versions
Columns: VersionID, FileID, Version, DateReleased, FileLocation

files 表为受版本控制的每个文件保留一条记录。版本表为每个文件的每个版本以及它的发布日期、版本号和位置保留一个记录。

现在我想要的是获取文件表中每个文件的最后一条记录(更新)。这应该由日期字段决定,该字段包含从发布时开始的 unix 时间戳。

我不想在每次发出更新请求时都遍历版本表中的每一行,那么可以在一个查询中执行此操作吗?

4

3 回答 3

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 表。这是你已经在做的吗?

于 2012-08-14T04:27:36.890 回答
4

您需要先获得DateReleased每个人的最大值,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
于 2012-08-14T04:46:39.840 回答
1

假设您在第二个表中至少有一个版本记录:

SELECT FileID, FileName, MAX(DateReleased)
FROM dev_version_control_files
INNER JOIN dev_version_control_versions ON FileID
GROUP BY FileID, FileName

这不是精确的 SQL,它是我将如何去做的一个粗略的想法。

于 2012-08-14T04:30:19.407 回答