2011-03-25 37 views
1

基本上我所拥有的是一个注释MySQL表。我有一个名为'parent_id'的列,用于跟踪评论是否是对其他评论的回复。帮助MySQL子查询

我想要做的是统计所有评论。这工作正常,但如果您删除评论而不是回复,它会将它们视为仍处于活动状态,但完好无损,将被删除。

这是我的MySQL查询,目前不工作...任何想法?

SELECT ic.* 
FROM roster_services_items_comments AS ic 
WHERE (SELECT icp.id FROM roster_services_items_comments AS icp 
     WHERE ic.parent_id = '' 
     OR (icp.id = ic.parent_id AND icp.deleted != 0) 
     LIMIT 1) IS NOT NULL 

回答

1

什么:

SELECT ic.*, COUNT(icp.parent_id) AS replies_count 
FROM roster_services_items_comments AS ic 
LEFT JOIN roster_services_items_comments AS icp ON ic.id = icp.parent_id 
WHERE ic.deleted != 0 
GROUP BY ic.id 
HAVING ic.parent_id IS NULL 

编辑:修正了计数,如果评论没有任何回复

+0

这只会计算根评论 – 2011-03-25 05:30:55

+0

@Yuri不会,它会计算每条评论的回复数。我不认为我们在这里处于递归问题。我理解的方式是评论只有1分。没有回复评论回复的概念等等。就像它在SO上的方式一样。 – 2011-03-25 05:37:15

+0

如果没有morble sublevels,那么没关系,你是对的 – 2011-03-25 05:55:51

0

你或许应该加上这标志着删除回复删除触发

的问题是,你需要recursivly检查可能的父母和父母的父母

你可以创建一个当前注释递归函数,这决定了它删除了父母或不

0
Select Count(*) 
From roster_services_items_comments As ic 
Where (ic.parent_id = '' And deleted = 0) 
    Or ic.id Not In (
        Select ic1.parent_id 
        From roster_services_items_comments As ic1 
        Where ic1.deleted = 1 
        ) 

能PARENT_ID真的是一个空字符串不算数?如果parent_id是最重要的评论,它会变得更加合理吗?如果这是真的,我们会有:

Select Count(*) 
From roster_services_items_comments As ic 
Where (ic.parent_id Is Null And deleted = 0) 
    Or ic.id Not In (
        Select ic1.parent_id 
        From roster_services_items_comments As ic1 
        Where ic1.deleted = 1 
        )