【发布时间】:2015-06-10 05:22:22
【问题描述】:
我正在构建的 JavaScript/PHP/MySQL 项目管理应用程序有一个面板/div,可以加载属于项目任务记录的所有事件/评论记录。
这些活动事件日志记录讲述了对任务记录所做修改的历史记录。他们在同一个流程中也有任务注释。
我现在正在尝试添加 Comment threading/child/sub-cmets。
我下面的屏幕截图显示了从右上角向下的第 5 条记录中的一个示例,它是一个缩进的评论,它似乎是它上面的评论记录(第 4 号)的子评论/子评论。
现在,如果您查看 DOM HTML 结构,您会发现子注释与 HTML 流中的父注释没有什么不同。这意味着子注释不是 HTML 中的子节点。相反,子评论位于父评论下方,并且只是有一个 CSS 类来表示它是应用 margin-left CSS 值和更小的 width 的子评论。
MySQL 数据库表
--
-- Table structure for table `updates_stream`
--
CREATE TABLE IF NOT EXISTS `updates_stream` (
`id` int(18) NOT NULL,
`event_type` varchar(10) DEFAULT 'comment',
`comment_id` int(36) DEFAULT NULL,
`comment_parent_id` int(36) DEFAULT '0',
`record_id` char(36) DEFAULT NULL,
`modified_user_id` int(36) DEFAULT NULL,
`record_name` varchar(255) DEFAULT NULL,
`date_entered` datetime DEFAULT NULL,
`date_modified` datetime DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=1092 DEFAULT CHARSET=utf8;
我试图用来获取 Parnet cmets 下的子 cmets 的 SQL 查询(不希望的结果)
SELECT * FROM updates_stream AS parent
LEFT JOIN updates_stream AS child
ON child.comment_parent_id = parent.id
WHERE parent.comment_parent_id = '0'
ORDER BY parent.id, child.id;
现在回答我的问题...
如何查询 MySQL 以正常获取所有记录,但现在我需要将所有子 cmets 放在父 cmets 下。
我上面的 MYSQL 代码是在 SQLFiddle 演示 上设置的,以便在此处进行测试:http://sqlfiddle.com/#!9/08396/4
我需要什么:
根据我的要求,有6条记录的demo的输出应该是这个ID顺序:
-- ID=1
-- ID=2
------- ID=3: child comment ID 3 has a Parent ID comment of 2
------- ID=5: child comment ID 5 has a Parent ID comment of 2
-- ID=4
-- ID=6
我得到了什么(坏了!):
相反,演示的结果如下所示...只有 5 行而不是全部 6 行。 ID 为 2 的 COMmment 连续列出 2 次,这有点正确,几乎意味着有子 cmets 的 1 条评论是ID2 有 2 个子 cmets。此外,如果您滚动到页面右侧的 ID2 行,您实际上会在右侧看到 ID 3 和 5,但在同一列中!:
-- ID=1
-- ID=2 ==> ID3
-- ID=2 ==> ID5
-- ID=4
-- ID=6
【问题讨论】:
-
我假设有孩子对孩子的可能性对吗?