Php 查询具有相关修订的记录
我创建了一个评论系统,允许用户提交对每个项目的评论 它变成了一个项目/范围的爬行,现在我需要实现用户编辑其原始评论并跟踪这些评论的功能 所有注释都位于注释表中Php 查询具有相关修订的记录,php,sql,oracle,oracle-call-interface,Php,Sql,Oracle,Oracle Call Interface,我创建了一个评论系统,允许用户提交对每个项目的评论 它变成了一个项目/范围的爬行,现在我需要实现用户编辑其原始评论并跟踪这些评论的功能 所有注释都位于注释表中 comments: id, comment, item_id, timestamp 既然必须跟踪修订,我创建了一个名为“修订: comment_id, revision_id, timestamp 所有评论(新的或旧的)都输入到评论表中,如果用户决定修改现有评论,它将作为评论中的新记录输入,然后记录到修订表中。一旦将新评论输入到com
comments: id, comment, item_id, timestamp
既然必须跟踪修订,我创建了一个名为“修订:
comment_id, revision_id, timestamp
所有评论(新的或旧的)都输入到评论表中,如果用户决定修改现有评论,它将作为评论中的新记录输入,然后记录到修订表中。一旦将新评论输入到comments表中,它将获取创建的id并将其传递到revisions.reivison\u id中,并使用用户修改的原始评论的id填充revisions.comment\u id(希望我没有丢失您)
现在我遇到了一个需要帮助的问题:我需要显示一个特定项的所有注释的列表,该列表将有一个类似以下内容的查询
select * from comments where item_id = 1
现在,我添加了修订表,我需要检索特定项的注释列表(就像上面的查询一样),如果任何注释被修订,我需要返回该注释的最新版本
实现这一目标的最佳方式是什么
我考虑运行两个查询,一个用于检索comments表中的所有注释,存储在数组中,另一个用于返回revisions表中的所有记录,我将在其中设置revisions.comment\u id为distinct,并且只希望返回最近的记录
修订查询可能如下所示
select comment_id DISTINCT, revision_id, timestamp
from revisions order by timestamp desc
仅显示每条评论的最新版本的最佳方式是什么(有些评论会有修订,而大多数评论不会)
我不是sql专家,所以可能需要使用sql来完成,或者我需要运行两个不同的查询,将数据存储到单独的数组中,然后运行每个数组,比较并删除该注释的旧版本?下面的示例(理论部分)
我想,如果有一种方法可以运行一个查询,只返回注释最新版本的列表,这是最佳做法,如果是,您可以为此提供适当的查询,否则,将两个查询分成两个数组并从注释数组中剥离出值是最佳方法还是更好的方法
提前感谢。首先,我将添加两种可选方法,然后使用查询进行编辑以处理当前模式 选项1-在评论中添加
deleted
标志。当评论被修改时,按照你已经做的去做,但也要把原来的评论当作删除了。然后,您只需要WHERE deleted=0
就可以查看活动注释
选项2-将修订表更改为注释表的克隆,并在修订时添加一个附加字段。现在,无论何时修改注释,都不要在注释中创建新记录,只需更新现有行并将新行添加到修订表中即可。这很容易用触发器维护,是一种非常标准的审核模式
编辑选项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
基于此,live评论是修订表中唯一没有条目的评论
SELECT *
FROM comment
WHERE NOT EXISTS (SELECT * FROM revision WHERE comment_id = comment.id)
AND item_id = @item_id
我喜欢选项1。这确实涉及到大约8个表,但我使用了两个表作为示例,否则我会对自己试图解释它感到困惑。
SELECT *
FROM comment
WHERE NOT EXISTS (SELECT * FROM revision WHERE comment_id = comment.id)
AND item_id = @item_id