查询具有与之相关的修订的记录

时间:2012-03-29 20:06:28

标签: php sql oracle oci

我创建了一个评论系统,允许用户提交每个项目的评论。

它变成了项目/范围蠕变的一点点,现在我需要实现用户编辑原始评论并跟踪这些评论的能力。

所有评论都位于评论表

comments: id, comment, item_id, timestamp

现在必须跟踪修订,我创建了一个名为revisions的新表:

comment_id, revision_id, timestamp

所有评论(新的或旧的)都被输入到评论表中,如果用户决定修改现有评论,它将作为评论中的新记录输入,然后记录到修订表中。一旦将新注释输入到注释表中,它将获取创建的id并将其传递到revisions.reivison_id,并且它将使用用户修改的原始注释的id填充revisions.comment_id(希望我没有'失去你。)

现在我遇到了我需要帮助的问题:我需要显示特定项目的所有评论列表,其中包含类似

的查询
select * from comments where item_id = 1

现在我添加了修订表,我需要检索特定项的注释列表(就像上面的查询一样)和(以及踢脚板)如果修改了任何注释,我需要返回最多该评论的最新版本。

实现这一目标的最佳方法是什么?

我考虑过运行两个查询,一个用于检索注释表中的所有注释,存储在一个数组中,另一个查询用于返回修订表中的所有记录,我将revisions.comment_id设置为distinct,并且仅想要返回更新的

修订版查询可能看起来像这样

select comment_id DISTINCT, revision_id, timestamp 
from revisions order by timestamp desc

仅显示每条评论的最新版本的最佳方式是什么(有些会有修订而大部分都没有)?

我不是sql专家,所以它可能是使用sql完成的,或者我需要运行两个不同的查询,将数据存储到单独的数组中,然后运行每个数组,比较并删除该注释的旧版本?下面的例子(理论上的一部分)

foreach($revisions as $r):
 $comments = strip key/value from comments array where $r['comment_id'] is 
 found in comments array
endforeach;

return $comments; // return the comments array after it was stripped of the older comments

我想如果有一种运行一个查询的方法只返回最新版本的注释列表是最好的做法,如果是这样,你可以提供相应的查询,否则是两个查询两个数组并以最佳方式或更好的方式从comments数组中去掉值?

提前致谢。

1 个答案:

答案 0 :(得分:2)

首先,我将添加两个替代方法,然后我将使用查询进行编辑以处理您当前的架构。

选项1 - 在评论中添加deleted标记。修改评论后,按照您的要求进行操作,但也将原始文件视为已删除。那么你只需要WHERE deleted = 0你想要有效的评论。

选项2 - 将修订表更改为注释表的克隆,以及修订时的附加字段。现在,每当修改注释时,不要在注释中创建新记录,只需更新existign行并在revisions表中添加新行。这可以通过触发器轻松维护,是一种非常标准的审核模式。


编辑选项3 - 用于处理您的架构的查询。

如上所述,如果我发表评论,然后编辑两次(没有其他活动),我会得到类似的内容......

 id |   comment    | item_id | timestamp
----+--------------+---------+-----------
  1 |   Hello,     |    1    |  13:00
  2 |   World!     |    1    |  14:00
  3 | Hello, World |    1    |  15:00

comment_id | revision_id | timestamp
-----------+-------------+-----------
    1      |       2     |    14:00
    2      |       3     |    15:00

基于此,实时评论是修订表中唯一没有条目的评论...

SELECT *
FROM   comment
WHERE  NOT EXISTS (SELECT * FROM revision WHERE comment_id = comment.id)
  AND  item_id = @item_id