Как вернуть 2 COUNT () - PullRequest
       3

Как вернуть 2 COUNT ()

1 голос
/ 06 мая 2011

У меня есть эта таблица:

forum_categories

  • ID
  • название

forum_topics

  • id
  • category_id (n-1 с forum_categories.id)

forum_messages

  • id
  • topic_id (n-1 с forum_topics.id)
  • первый

Я хотел бы вернуть forum_categories.title, count(forum_topics.id) (я имею в виду номер темы для этой категории) , count(forum_messages.id) (я имею в виду количество сообщений для этой темы, где поле первое равно 0) .

Это пример:

forum_categories            forum_topics            forum_messages
1   title1                  1   1                   1       1       0
2   title2                  2   2                   2       2       1
3   title3                  3   1                   3       3       1
                            4   1                   4       6       1
                            5   3                   5       7       0
                            6   3                   6       2       0
                            7   2                   7       1       1
                                                    8       3       0
                                                    9       5       0
                                                    10      7       1
                                                    11      5       1
                                                    12      1       0

Выход должен быть:

title1      3       3 (topic 1=2 + topic 3=1 topic4=0
title2      2       2 (topic2=1 + topic7=1)
title3      2       1  (topic5=1 + topic6=0)

Пробовал что-то вроде:

SELECT forum_categories.description, 
       COUNT(forum_topics.id), 
       COUNT(forum_messages.id)
  FROM forum_categories 
  JOIN forum_topics 
  JOIN forum_messages ON forum_categories.id = forum_topics.category_id 
                     AND forum_topics.id = forum_messages.topic_id
GROUP BY forum_categories.id, forum_messages.id
ORDER BY forum_categories.date

Но это совсем далеко от моей цели (а также я не знаю, как проверить поле * forum_messages.first *! Любая помощь?

EDIT

Благодаря Джиму Рубинштейну это частичное решение:

SELECT fc.description, COUNT(DISTINCT ft.id) topics, COUNT(fm.id) 
FROM forum_categories fc 
JOIN forum_topics ft ON ft.category_id = fc.id 
JOIN forum_messages fm ON fm.topic_id = ft.id
GROUP BY fc.id ORDER BY fc.date 

Проблема этого запроса заключается в том, что подсчитывается каждое сообщение с forum_messages, но мне нужно подсчитывать это сообщение для каждой темы только тогда, когда field = 0 .

РЕДАКТИРОВАТЬ 2

Я думаю, что нашел решение:

SELECT fc.title, COUNT(DISTINCT ft.id) topics, COUNT(fm.id) 
FROM forum_categories fc 
JOIN forum_topics ft ON ft.category_id = fc.id 
LEFT OUTER JOIN (SELECT id, topic_id, first FROM forum_messages WHERE first=0) fm ON fm.topic_id = ft.id
GROUP BY fc.id ORDER BY fc.date 

О чем вы думаете? Могу ли я лучше?

Ответы [ 2 ]

2 голосов
/ 06 мая 2011

Вы должны быть в состоянии выполнить это с ключевым словом DISTINCT.Вы также хотите GROUP BY category_id, чтобы получить счет для тем / сообщений для каждой категории.

SELECT fc.description, COUNT(DISTINCT ft.id) topics, COUNT(fm.id) messages
FROM forum_categories fc
JOIN forum_topics ft ON ft.category_id = fc.id
JOIN form_messages fm ON fm.topic_id = ft.id
WHERE fm.first = 0
GROUP BY fc.id
ORDER BY fc.date

другой вариант:

SELECT fc.description, COUNT(DISTINCT ft.id) topics, SUM(CASE WHEn fm.first = 0 THEN 1 ELSE 0) messages
FROM forum_categories fc
JOIN forum_topics ft ON ft.category_id = fc.id
JOIN form_messages fm ON fm.topic_id = ft.id
WHERE fm.first = 0
GROUP BY fc.id
ORDER BY fc.date

примечание: Я присвоил вашим таблицам более короткие имена ... потому что мне лень набирать полные имена снова и снова.ха-ха.

0 голосов
/ 06 мая 2011

Вы можете использовать такие подзапросы, как:

 select (select count(*) from ...., select count(*) from ....)
...