从另一个表中选择与最高版本文件匹配的所有ID

时间:2014-03-19 16:12:37

标签: database sqlite select

我正在使用此布局使用sqlite编写简单的备份程序: enter image description here

每个文件都由唯一哈希标识,并且在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)。

1 个答案:

答案 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

通用表格表达式可以让您在数百万条记录中获得更好的性能。请确保您的桌子上有正确的索引