MySQL - Как посчитать количество строк из основного запроса, игнорировать строки подзапроса? - PullRequest
1 голос
/ 27 июля 2011

Я использую следующий 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.

Спасибо за помощь - выложу больше кода при необходимости.

Ответы [ 3 ]

2 голосов
/ 27 июля 2011

Не самый быстрый, но вы не ограничены в использовании 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
1 голос
/ 27 июля 2011

Вы можете выполнить другой запрос или добавить еще один столбец (с независимым подзапросом) в наборе результатов:

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 голосов
/ 27 июля 2011
COUNT(DISTINCT forum_qa.forum_qa_id)

COUNT(DISTINCT col_name) считает отдельные идентификаторы постов. Это должно равняться количеству сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...