开发者

MySQL - How to count number of rows from primary query, ignore subquery rows?

开发者 https://www.devze.com 2023-03-23 02:12 出处:网络
I use the following MySQL to return a list of posts and their corresponding comments. SELECT* FROMforum_qa

I use the following MySQL to return a list of posts and their corresponding comments.

    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

If I run

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

This allows me to get the number of returned rows and pass the array to my controller and view.

But this is returning all rows (posts + comments). So if 1 post has 10 comments, it returns 10.

How could I have this query count only the number of posts (ie, returning 1) not including the subquery?

Each post has a unique id saved in forum_qa.forum_qa_id

Each comment has a unique id saved in forum_cm.forum_cm_id.

Thanks for helping -- will post more code if needed.


Not the fastest, but you are not restricted in using 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


You can run another query or add one more column (with an independent subquery) in the result set:

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


COUNT(DISTINCT forum_qa.forum_qa_id)

COUNT(DISTINCT col_name) counts the distinct post ids. This should equal the number of posts.

0

精彩评论

暂无评论...
验证码 换一张
取 消