【问题标题】:querying records that have revisions related to them查询具有相关修订的记录
【发布时间】:2012-03-29 20:06:28
【问题描述】:

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

它变成了项目/范围蔓延的一部分,现在我需要实现用户编辑其原始 cmets 并跟踪这些 cmets 的功能。

所有 cmets 都位于 cmets 表中

comments: id, comment, item_id, timestamp

既然必须跟踪修订,我创建了一个名为修订的新表:

comment_id, revision_id, timestamp

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

现在我遇到了需要帮助的问题:我需要显示特定项目的所有 cmets 的列表,该列表会查询类似

select * from comments where item_id = 1

现在我添加了修订表,我需要检索特定项目的 cmets 列表(就像上面的查询一样)并且(这是踢球者)如果有任何评论被修订,我需要返回最该评论的最新版本。

最好的方法是什么?

我考虑过运行两个查询,一个是检索 cmets 表中的所有 cmets,存储在一个数组中,另一个查询是返回 revisions 表中的所有记录,我将在其中将 revisions.comment_id 设置为不同的并且只会想要返回最近的一个

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

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

我想如果有一种方法可以运行一个查询以仅返回评论的最新版本列表是最佳做法,如果是这样,您能否为此提供适当的查询,否则这两个查询是两个数组并从 cmets 数组中剥离值是最好的方法还是更好的方法?

提前致谢。

【问题讨论】:

    标签: php sql oracle oracle-call-interface


    【解决方案1】:

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

    选项 1 - 将 deleted 标志添加到您的 cmets。当评论被修改时,按照你已经做的那样做,但也将原来的内容设置为已删除。那么你只需要WHERE deleted = 0 来激活你想要的 cmets。

    选项 2 - 将您的修订表更改为注释表的克隆,加上一个附加字段,用于记录何时进行修订。现在,每当您修改评论时,不要在评论中创建新记录,只需更新现有行并在修订表中添加新行。这可以通过触发器轻松维护,并且是一种非常标准的审计模式。


    EDIT 选项 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
    

    【讨论】:

    • 我喜欢选项1。这确实涉及大约8个表,但我以两个表为例,否则我试图解释它会感到困惑。
    猜你喜欢
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多