PHP/MySql 选择与回复分组的评论

Posted

技术标签:

【中文标题】PHP/MySql 选择与回复分组的评论【英文标题】:PHP/MySql Select Comments Grouped with Replies 【发布时间】:2011-03-07 17:12:58 【问题描述】:

我正在编写一个脚本来处理类似于 facebook 的状态/回复的 cmets。基本上,一个项目可以有 cmets 并且用户可以回复该评论(最多一级深度)。

我的表设置如下:

Comments: [ Comment_ID | User_ID | Content | etc...]
Comments_Reply: [ Comment_ID | Is_Reply_To ] 

因此,如果用户回复评论 #555,它会像常规评论一样出现在 cmets 表中,然后还会在 Comments_Reply 中获得一行 [ 555 | 新评论 ID ]

如何选择 cmets 以使其按以下顺序排列:

[ 555 | ....
[ New Comment that replies to 555
[556 | ....
[557 | ....

等等...在回复的评论之后按顺序显示回复。我正在使用 phpmysql

【问题讨论】:

【参考方案1】:

好的,我想我现在得到了你想要的。我没有办法快速测试这个函数的 MYSQL 版本,但是 SQLite 版本很好用,根据文档,MySQL 应该也能很好地工作。不过可能是在 MySQL 上执行此操作的更好方法。

SQLite:

SELECT a.*, IFNULL( b.Is_Reply_To, a.Comment_ID ) as Is_Reply_To FROM Comments a LEFT JOIN Comments_Reply b HAVING(Comment_ID) ORDER BY Is_Reply_To ASC, a.Comment_ID ASC

MySQL

SELECT a.*, IF( IS NULL(b.Is_Reply_To), a.Comment_ID, b.Is_Reply_To ) as Is_Reply_To FROM Comments a LEFT JOIN Comments_Reply b HAVING(Comment_ID) ORDER BY Is_Reply_To ASC, a.Comment_ID ASC

这会为我的 SQLite 生成这些结果。

Comment_ID Is_Reply_to
1          1
10         1
11         1
2          2
12         2
3          3
13         3
14         3
4          4
5          5
6          6
7          7
8          8
9          9
15         15

【讨论】:

这是如何工作的,因为 LEFT JOIN 没有“ON”语句 @kornesh HAVING 如果两个表中要匹配的列具有相同的名称,则有效。【参考方案2】:

您好,您可以使用以下查询

$q="从 cmets 中选择 *"; $rs=mysql_query($q); if($rs && mysql_num_rows($rs)) 而($rd=mysql_fetch_object($rs)) 回声($rd->comment_id); $q1="select * from cmets_reply where comment_id=".$rd->comment_id; $rs1=mysql_query($q1); if($rs1 && mysql_num_rows($rs1)) 而($rd1=mysql_fetch_object($rs1)) 回声($rd1->cmets_id);

【讨论】:

拥有 10,000 个 cmets,您的查询会寻求帮助。

以上是关于PHP/MySql 选择与回复分组的评论的主要内容,如果未能解决你的问题,请参考以下文章

PHP实现简单的评论与回复功能还有删除信息

Mysql - 正确排序 Facebook 帖子、评论和回复

评论回复功能设计

如何正确排序我的评论/回复/回复以回复数据

java web 评论及回复系统

计算机网络-分组交换与电路交换