我被难住了。我需要在查询循环中访问下一个nth row
,以显示帖子之间的版本差异。
我使用<cfquery>
按组输出修订,这是我的预期输出:
Rev4
diff(rev4.title, original.title)
diff(rev4.brief, rev2.brief)
Rev3
diff(rev3.body, rev2.body)
Rev2
diff(rev2.brief, original.brief)
diff(rev2.body, original.body)
Original
query.title
query.brief
query.body
我最初认为使用Java方法来获取下一个查询行。这行不通:
- Rev4需要显示其自己的简要行与对简要行进行的最后一次修订之间的差异;在本例中,发生在Rev2;所以它需要跳转一行。
- 为了显示其title行的差异,Rev4需要跳转到原始 post,因为title行的第一次更改发生在Rev4本身。
一些需要考虑的事情:
- 修订模式为每个编辑的帖子列对应一行;因此,如果你加载一个帖子并编辑它的标题和正文,两个记录将在修订模式中创建;一个用于标题,一个用于正文,在同一个revisionGUID下。
- 查询按照revisionGUID分组。
- 按修订日期排序,从最新到最旧;然后通过修订类型(标题, , )。
我把它标记为Java,因为ColdFusion允许我们在查询对象上使用Java方法,但它没有文档,所以仅仅知道它的存在对我没有帮助。
谁能告诉我一个更好的方法来做这件事?我想到的代码结构:
<cfoutput query="revisions" group="revisionGUID">
#revision.revisionGUID#
<cfoutput>
// conditional logic to get diff();
<cfoutput>
</cfoutput>
对不起,我不知道Coldfusion,但它听起来像(Java)可滚动的resultSet可能有用。
从oracle信息页:
5.1滚动
通过执行语句创建的结果集可能支持通过其向后移动(从最后到第一)的能力内容,以及转发(先到后)。支持以下功能的结果集此功能称为可滚动结果集。结果集是可滚动的,也支持相对和绝对定位。绝对定位是指直接移动到某一行的能力指定其在结果集中的绝对位置,而不是相对位置定位提供了通过指定a移动到一行的能力相对于当前行的位置。(链接:结果集增强)
ResultSet api在顶部简要地提到了它:
http://download.oracle.com/javase/1.4.2/docs/api/java/sql/ResultSet.html默认ResultSet对象不可更新,其游标为只能向前移动。因此,您只能遍历它一次只从第一行到最后一行。生产是可能的可滚动和/或可更新的ResultSet对象。以下代码片段,其中con是一个有效的Connection对象如何使一个结果集是可滚动的和不敏感的更新其他人,这是可以更新的。其他请参见ResultSet字段选项。
希望这能帮助你找到你正在寻找的=)
如果您让数据库帮助您并使用以下查询来查找您的字段的先前值:
SELECT TITLE AS PREVIOUSTITLE
FROM REVISIONS
WHERE ID < #query.id# AND TITLE <> '#query.title#'
ORDER BY ID DESC
SELECT BRIEF AS PREVIOUSBRIEF
FROM REVISIONS
WHERE ID < #query.id# AND BRIEF <> '#query.brief#'
ORDER BY ID DESC
SELECT BODY AS PREVIOUSBODY
FROM REVISIONS
WHERE ID < #query.id# AND BODY <> '#query.body#'
ORDER BY ID DESC
如果recordcount为0,这意味着该字段从未更改。