mySql统计所有最新版本

时间:2015-08-19 08:23:10

标签: mysql sql database cakephp-2.0

在昨天有一个问题,不幸的是我没有给自己解释得很好 - 其中一个结束了一天的事情。

无论如何,我有一张叫做文件的桌子......

+----+--------------------------------------+-----------+---------+---------+
| id | document_guid                        | title     | version | payload |
+----+--------------------------------------+-----------+---------+---------+
| 1  | 0D2753BE-583B-42CE-B0DA-1FD0171D95C0 | animation | 1       | {}      |
| 2  | 0D2753BE-583B-42CE-B0DA-1FD0171D95C0 | animation | 2       | {}      |
| 3  | 1C2A1131-0261-4D58-81AA-EFAB5285B282 | formation | 1       | {}      |
| 4  | 1E17403F-C590-4CE4-9E79-E1B7C98F97F1 | session   | 1       | {}      |
| 4  | 1E17403F-C590-4CE4-9E79-E1B7C98F97F1 | session   | 2       | {}      |
+----+--------------------------------------+-----------+---------+---------+

如您所见,我们可以拥有同一文档的多个版本(由document_guid引用)。我需要的是表中所有文件的计数,不包括过时的版本。即如果文件1E17403F-C590-4CE4-9E79-E1B7C98F97F1有两个版本,就像它在上面的例子中所示,那么它应该只占整个计数中的一个文件。

我真的希望这比我的上一个问题更有意义。

我遇到的主要问题是我需要一个类似的查询来返回所有最新版本,而不仅仅是计数。

2 个答案:

答案 0 :(得分:2)

计算不同的document_guids:

select count(distinct document_guid) from documents

要返回每个文档的最新版本,您可以执行GROUP BY(作为user2864740'答案)或NOT EXISTS

select * from documents d1
where not exists (select 1 from documents d2
                  where d2.document_guid = d1.document_guid
                    and d2.version > d1.version)

即。如果没有其他具有相同document_guid的版本号更高,则返回一行。

答案 1 :(得分:2)

有用的查询可能如下所示:

-- select the maximum version (and other information, per group)
-- can also add a 'count(1) as version_count' if required
select max(version) as latest_version, title, document_guid
from documents
-- from each group, as divided up by the same guid *see note 1
group by document_guid, title

此查询返回最新版本号;总有"一个最新版本"每份文件。

1 标题可能是规范化的中断,需要成为该组的一部分,以便将其包含在结果列中;如果不需要,可以将其删除。

如果标题是可以更改版本的必填字段,那么这需要以不同的方式编写 - 首先找到"最新版本"然后将其与适当的行连接起来。一个例子:

select t.latest_version, d.title, d.document_guid
from documents d
join (
  select max(version) as latest_version, document_guid
  from documents
  group by document_guid
) t
on t.document_guid = d.document_guid and t.latest_version = d.version

当然,这假定了(document_guid, version)的关键字。