2010-09-17 232 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 這總是會爲您帶來零結果。