【问题标题】:mySql count all latest versionsmySql 统计所有最新版本
【发布时间】:2015-08-19 08:23:09
【问题描述】:

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

反正我有一张叫做文件的表格...

+----+--------------------------------------+-----------+---------+---------+
| 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 有两个版本,如上例所示,那么它应该只占总计数中的一个文档。

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

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

【问题讨论】:

  • 我们如何知道版本是否已经过时?
  • 这里的“最新版本”与“只有一个”有什么不同吗?

标签: mysql sql database cakephp-2.0


【解决方案1】:

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

-- 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)

【讨论】:

    【解决方案2】:

    计算不同的 document_guid:

    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 且版本号更高的行,则返回一行。

    【讨论】:

    • 这确实返回了正确的数量,尽管我需要一个类似的查询来返回所有最新版本而不是计数。
    猜你喜欢
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多