我正在使用此布局使用sqlite编写简单的备份程序:
每个文件都由唯一哈希标识,并且在file_version中有多个相关记录。创建数据库快照时,大多数当前file_versions都通过snapshot_file与其关联。
示例:
文件(哈希,路径)
abc|/img.png bcd|/img.jpeg
file_version(id,mtime,md5,hash)
1|1000|md5aoeu|abc 2|1500|md5bcda|abc 3|2500|md5asdf|abc 4|2500|md5aoaa|bcd
快照(时间,描述)
1250| 'first snapshot' 2000| 'second snapshot' 3000| 'third snapshot'
当我尝试创建新快照时,我需要查询每个文件的最新file_versions并将相应的记录添加到snapshot_file中。 因此,如果我要创建新快照,我需要使用hash'abc'(匹配文件/img.png)来获取最新文件版本的文件ID。
因此,此查询的select的预期返回值为:
3|2500|abc 4|2500|bcd
抱歉,我的英语非常糟糕(标题可能令人困惑),如果您需要进一步澄清,请知道。 提前谢谢。
这类似于: How can I select all entries with the highest version? 但是它稍微复杂一点(因为每个文件只能有一个id)。
答案 0 :(得分:1)
我会尝试这样的事情:
SELECT i.*
FROM file_versions i
INNER JOIN (
SELECT
hash,
MAX(mtime) AS latestTime
FROM file_versions
GROUP BY hash
)latest ON i.mtime = latest.latestTime
and i.hash = latest.hash
修改强>
根据OP的评论,我会更改代码以使用CTE
WITH latest_CTE AS (hash, latestTime)
SELECT
hash,
MAX(mtime) AS latestTime
FROM file_versions
GROUP BY hash
)
SELECT i.* FROM file_version i
JOIN latest_CTE c on i.mtime = c.latestTime
AND i.hash = c.hash
通用表格表达式可以让您在数百万条记录中获得更好的性能。请确保您的桌子上有正确的索引