【问题标题】:Help with MySQL sub query帮助 MySQL 子查询
【发布时间】:2011-03-25 05:05:53
【问题描述】:

基本上我拥有的是一个 cmets MySQL 表。我有一个名为“parent_id”的列,它跟踪评论是否是对另一评论的回复。

我想要做的是计算所有的 cmets。这工作正常,但如果您删除评论而不是回复,它会将它们视为仍然有效但完好无损,它们将被删除。

这是我的 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

【问题讨论】:

    标签: mysql


    【解决方案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
    

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

    【讨论】:

    • 这将只计算根 cmets
    • @Yuri 不,它会计算每条评论的回复数。我不认为我们在这里遇到递归问题。我理解它的方式是只有 1 个“子级别”的 cmets。没有回复评论的回复等等的概念。就像它在 SO 上的方式一样。
    【解决方案2】:

    您可能应该添加一个触发器,将已删除的回复标记为删除

    问题是您需要递归检查当前评论以查找可能的父母和父母的父母

    您可以创建一个递归函数,以确定它是否删除了父母

    【讨论】:

      【解决方案3】:
      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 为 NULL 不是更有意义吗?如果这是真的,我们会有:

      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
                          )
      

      【讨论】: