我正在尝试计算我的评论和回复,但我似乎无法做到正确。
到目前为止,这是我的查询。
SELECT posts_comments.*, users.*
(SELECT COUNT(*)
FROM posts_comments
WHERE parent_comment_id >= 1)
FROM posts_comments
LEFT JOIN users
ON posts_comments.user_id = users.user_id
WHERE post_id = '" . $post_id . "'
AND parent_comment_id = 0
LIMIT $start, $display
这是我的MySQL表。
CREATE TABLE posts_comments (
comment_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
parent_comment_id INT UNSIGNED NOT NULL,
user_id INT UNSIGNED NOT NULL,
post_id INT UNSIGNED NOT NULL,
comment TEXT NOT NULL,
PRIMARY KEY (id),
);
显示输出。
COMMENT 1
comment 2
comment 3
COMMENT 4
COMMENT 5
答案 0 :(得分:1)
您正在使用adjacency list model整理分层数据。事实上,这种递归操作往往很困难,这实际上是这种模型的一个主要缺点。
某些DBMS(如SQL Server 2005,Postgres 8.4和Oracle 11g R2)支持使用common table expressions WITH
关键字进行递归查询(另请参阅下面的@OMG Ponies'注释)。此功能允许轻松实现此类查询,但遗憾的是MySQL尚不支持递归查询。
在以下系列文章中,@Quassnoi提出了一种解决MySQL中分层查询的解决方案,您可能需要查看:
您可能也有兴趣查看以下描述替代模型(nested set model)的文章,这使得递归操作更容易:
此外,我还建议您通过@Bill Karwin查看以下演示文稿:
演示文稿中描述的闭包表模型是嵌套集的非常有效的替代方法。他在SQL Antipatterns书(excerpt from the chapter on this topic [PDF])中进一步描述了这个模型。
否则,您还可以考虑将所有数据下载到您的应用程序,构建树并遍历它。
答案 1 :(得分:1)
您无法在同一查询中获得父评论和子评论的计数。如果您想要像您发布的那样输出,则每次击中孩子时都必须分开并发送查询。 (使用for()
)
或者有另一个专栏,让你的程序分解结果。
此外,在您的查询中,您有AND parent_comment_id = 0
而其他SELECT有AND parent_comment_id >= 1
这总是会给你带来零结果。