MySQL查询计数问题

时间:2010-09-17 04:04:10

标签: sql mysql

我正在尝试计算我的评论和回复,但我似乎无法做到正确。

到目前为止,这是我的查询。

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

2 个答案:

答案 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 这总是会给你带来零结果。