2010-09-17 130 views
2

我想数我的意见,并在那里答复,但我似乎无法得到它的权利。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 
+1

你能告诉我们一些样本期望的输出吗? – 2010-09-17 04:08:06

+0

不是它是一回事吗? – FOXvsNBC 2010-09-17 04:16:45

回答

1

您正在使用adjacency list model组织您的分层数据。这种递归操作往往很困难的事实实际上是这种模型的一个主要缺点。

某些DBMS(如SQL Server 2005,Postgres 8.4和Oracle 11g R2)支持使用common table expressionsWITH关键字(也参见下面的@OMG Ponies'评论)的递归查询。此功能允许像这样的查询轻松实现,但不幸的是,MySQL不支持递归查询。

在接下来的系列文章中,@Quassnoi提出一个解决方案,以解决层次查询MySQL中,你可能想看看:

您也可以可能感兴趣的查看以下描述替代模型(nested set model)的文章,这使得递归操作更容易:

此外,我还建议通过@Bill Karwin检查出下面的介绍:

在演示文稿中所描述的封闭表模式是一种非常有效的替代嵌套集合。他在他的SQL Antipatterns书(excerpt from the chapter on this topic [PDF])中进一步描述了这个模型。

否则,您也可以考虑将所有数据下载到您的应用程序,构建一棵树,然后穿过它。

+0

自v2以来,Oracle支持使用'CONNECT BY'语法的分层/递归查询 – 2010-09-17 04:34:16

1

你不可能有相同查询的父注释和子注释的计数。如果您希望发布像您这样的输出,您每次碰到孩子时都必须分开并发送一个查询。 (使用for()) 或者有另一列,让你的程序分解结果。

此外,在您的查询中,您有AND parent_comment_id = 0,而其他SELECT有AND parent_comment_id >= 1 这总是会为您带来零结果。