2011-07-27 46 views
1

我使用以下MySQL來返回帖子列表及其相應的評論。MySQL - 如何統計主查詢中的行數,忽略子查詢行?

SELECT * 
    FROM forum_qa 
      JOIN user_profiles 
       ON user_id = forum_qa_author_id 
      LEFT JOIN (SELECT forum_cm_id, 
           forum_cm_author_id, 
           forum_qa_id_fk, 
           forum_cm_text, 
         FROM forum_cm 
         JOIN user_profiles 
          ON user_id = forum_cm_author_id) AS c 
       ON forum_qa_id = c.forum_qa_id_fk 
    WHERE forum_qa_parent_id = $forum_qa_id 

如果我運行

$data['num_answers'] = $query->num_rows(); 

這可以讓我返回的行數和數組傳遞給我的控制器和視圖。

但是,這是返回全部行(帖子+評論)。所以如果1篇文章有10條評論,它會返回10

我怎麼能讓這個查詢只計算髮布的數量(即返回1)不包括子查詢?

每個帖子都有保存在forum_qa.forum_qa_id

每條評論都有保存在forum_cm.forum_cm_id唯一ID的唯一ID。

感謝您的幫助 - 如果需要,會發布更多代碼。

+0

如果一篇文章有​​10條評論,我希望你得到'10'而不是'11'。 –

+0

是的,這是正確的我修正了OP – pepe

回答

2

不是最快的,但你是不是在使用GROUP BY限制:

SELECT *, 
    (SELECT COUNT(*) FROM forum_qa WHERE forum_qa_parent_id = $forum_qa_id) Cnt 
    FROM forum_qa 
      JOIN user_profiles 
       ON user_id = forum_qa_author_id 
      LEFT JOIN (SELECT forum_cm_id, 
           forum_cm_author_id, 
           forum_qa_id_fk, 
           forum_cm_text, 
         FROM forum_cm 
         JOIN user_profiles 
          ON user_id = forum_cm_author_id) AS c 
       ON forum_qa_id = c.forum_qa_id_fk 
    WHERE forum_qa_parent_id = $forum_qa_id 
+0

是的 - 那就是訣竅 - 非常感謝您的幫助! – pepe

0
COUNT(DISTINCT forum_qa.forum_qa_id) 

COUNT(DISTINCT col_name)計算不同的帖子ID。這應該等於帖子的數量。

+1

COUNT(DISTINCT)是一個聚合函數。 GROUP BY也應該被指定。 – CristiC

1

可以運行另一個查詢或在結果集中添加更多的列(具有獨立的子查詢):

SELECT * 
    , (SELECT COUNT(*) 
     FROM forum_qa 
     WHERE forum_qa_parent_id = $forum_qa_id 
     ) AS cntPosts 
FROM forum_qa 
     JOIN user_profiles 
      ON user_id = forum_qa_author_id 
     LEFT JOIN (SELECT forum_cm_id, 
          forum_cm_author_id, 
          forum_qa_id_fk, 
          forum_cm_text, 
        FROM forum_cm 
        JOIN user_profiles 
         ON user_id = forum_cm_author_id) AS c 
      ON forum_qa_id = c.forum_qa_id_fk 
WHERE forum_qa_parent_id = $forum_qa_id 
+0

thx @ypercube - – pepe