У меня есть эта таблица:
forum_categories
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
О чем вы думаете? Могу ли я лучше?