2010-04-04 3 views
2

У меня есть следующие таблицы:MySQL GROUP BY с тремя таблицами

posts (post_id, content, etc) 

comments (comment_id, post_id, content, etc) 

posts_categories (post_category_id, post_id, category_id) 

и этот запрос:

SELECT `p`.* 
    , COUNT(comments.comment_id) AS cmts 
    , posts_categories.* 
    , comments.* 
    FROM `posts` AS `p` 
    LEFT JOIN `posts_categories` 
    ON `p`.post_id = `posts_categories`.post_id 
    LEFT JOIN `comments` 
    ON `p`.post_id = `comments`.post_id 
GROUP BY `p`.`post_id` 

Есть три замечания по POST_ID = 1 и четыре в общей сложности. В posts_categories есть две строки, оба назначенные post_id = 1. У меня есть четыре строки в сообщениях.

Но если я запрошу заявление выше, я получаю результат 6 для COUNT(comments.comment_id) при post_id = 1. Как это возможно? Я предполагаю, что ошибка находится где-то в предложении GROUP BY, но я не могу понять, где.

Любые предложения?

ответ

1

В первом приближении попробовать

SELECT `p`.* 
    , COUNT(DISTINCT comments.comment_id) AS cmts 
    , posts_categories.* 
    , comments.* 
    FROM `posts` AS `p` 
    LEFT JOIN `posts_categories` 
    ON `p`.post_id = `posts_categories`.post_id 
    LEFT JOIN `comments` 
    ON `p`.post_id = `comments`.post_id 
GROUP BY `p`.`post_id` 

EDIT:

Однако COUNT (DISTINCT поле) является более дорогим, то COUNT (поле) и его следует избегать, если нет необходимости. Поскольку вы этого не ожидаете, я бы сказал, что в вашем случае это не обязательно.

Ваша проблема возникает из-за того, что ваши соединения возвращают 3 (комментарии) x 2 (категории) = 6 строк. Я не знаю, для чего вы используете результаты, но, возможно, вам стоит пересмотреть свой запрос.

0

Мое предположение, что у вас есть более одной категории!

ли

SELECT P.post_id 
    , PC.post_category_id 
    , COUNT(C.comment_id) AS cmts 
    FROM `posts` AS P 
    LEFT JOIN `posts_categories` as PC 
    ON `p`.post_id = `posts_categories`.post_id 
    LEFT JOIN `comments` as C 
    ON P.post_id = C.post_id 
GROUP BY P.post_id, PC.post_category_id 

дать вам 'понятного' результат?

BTW Вы должны иметь все поля предложения GROUP BY, не обобщается ...

+0

В mysql не обязательно перечислять все поля в GROUP BY, но затем это приводит к описанным выше проблемам со счетом – Unreason

+0

. Что относительно post_category_id? Вы попробовали запрос. Если вы не понимаете, что я имею в виду, посмотрите на ответ @Adam Bernier. – lexu

+0

Не работает для меня, я ушел из GROUP_CONCAT, чтобы сделать запрос проще. Спасибо в любом случае – Psaniko

0

Вы получаете шесть (6) комментарии, потому что ваш ResultSet выглядит примерно так:
(обратите внимание на две группы из трех строк каждая по одному на каждую должность категории, сокращенно PCAT *)

 
post_id cmts post_cat comments 
1  6  pcat1  comment text... 
1  6  pcat1  comment text... 
1  6  pcat1  comment text... 
1  6  pcat2  comment text... 
1  6  pcat2  comment text... 
1  6  pcat2  comment text... 

Вы можете сделать что-то вроде этого, вместо:

SELECT `p`.post_id, 
     COUNT(comments.comment_id) AS cmts, 
     COUNT(posts_categories.) AS categories 
    FROM `posts` AS `p` 
     LEFT JOIN `posts_categories` 
     ON `p`.post_id = `posts_categories`.post_id 
     LEFT JOIN `comments` 
     ON `p`.post_id = `comments`.post_id 
GROUP BY `p`.`post_id` 
+0

Извините, но я всегда получаю 6 комментариев, которые, безусловно, неверны. В любом случае, я, возможно, недостаточно объяснил, что хочу. – Psaniko