2012-05-28 3 views
0

Я знаю, что есть куча нитей, похожих на это, и я просмотрел много, но не смог найти решение. Итак, у меня есть одна таблица под названием «форум», в которой хранятся мои категории (num_type = 0), темы (num_type = 1) и сообщения (num_type = 2). Существует столбец num_parent, который будет связывать Thread/Post с родительской категорией/нитью. С запросом, с которым у меня возникают проблемы, я пытаюсь получить все категории, общие потоки внутри каждой категории и общие сообщения в потоках каждой категории. Для этого я пытаюсь:Форум MySQL Категория, Тема, Сообщение

select F.* 
, count(F2.num_Forum) as num_ThreadCount 
, count(F3.num_Forum) as num_PostCount 
, max(F3.dte_Created) as dte_LastPost 
from forum F 
left outer join forum F2 
on F.num_Forum=F2.num_Parent and F2.num_Type=1 
left outer join forum F3 
on F2.num_Forum=F3.num_Parent and F3.num_Type=2 
where F.num_Type=0 and F.num_Inactive=0 
group by F.num_Forum 
order by F.num_Sticky desc, F.dte_Created desc 

Данные dte_LastPost и num_PostCount выдаются правильно. Номер num_ThreadCount - нет. Если я разбиваю запрос на два отдельных запроса:

select F.* 
, count(F2.num_Forum) as num_ThreadCount 
from forum F 
left outer join forum F2 
on F.num_Forum=F2.num_Parent and F2.num_Type=1 
where F.num_Type=0 and F.num_Inactive=0 
group by F.num_Forum 
order by F.num_Sticky desc, F.dte_Created desc 

select count(F3.num_Forum) as num_PostCount 
from forum F2 
left outer join forum F3 
on F2.num_Forum=F3.num_Parent and F3.num_Type=2 
where F2.num_Type=1 and F2.num_Inactive=0 
group by F2.num_Forum 
order by F2.num_Sticky desc, F2.dte_Created desc 

Я получаю правильный счет для каждого. Но мне нужно каким-то образом объединить их, чтобы я знал, какой категории соответствует num_PostCount. Большая разница, которую я вижу в этом отдельно, заключается в том, что во втором запросе я могу сделать группу по F2.num_Forum. Я попытался добавить его в запрос конгломерата, но он не исправил мою проблему. Кто-нибудь знает, что мне нужно сделать, чтобы исправить мой первый запрос?

+1

Звучит так, как будто вы должны переделать свою базу данных. Нить не форум, и сообщение не является нитью и не является форумом. Похоже, вы слишком много забиваете в одном столе. – Corbin

+0

Я ценю ваш вклад, но я подумал о дизайне какое-то время, и это так, как мне бы хотелось. Сначала я подумал о том, чтобы разбить его на три таблицы, но вскоре понял, что столбцы были избыточными, и единственное различие было бы в названии таблиц. – ScubaSteve

+0

@ Корбин прав ... ваш подход все испорчен. Просто потому, что все три таблицы могут иметь одинаковую структуру в терминах столбцов и типа данных, не означает, что они избыточны. Вы говорите о 3 совершенно разных фрагментах данных - Forum, Post и Thread, каждый из которых правильно принадлежит их собственным таблицам. Любые дальнейшие запросы/поиск по вашему дизайну станут излишне сложными и подвержены ошибкам. – GDP

ответ

0

Хорошо, мне удалось выяснить, как связать три таблицы БЕЗ размещения столбца в таблице Posts, чтобы связать его непосредственно с категорией. Вместо этого, Категории ссылаются на темы, которые ссылаются на сообщения, вниз и вверх по цепочке.

select C.* 
, count(TP.num_Thread) as num_ThreadCount 
, coalesce(sum(TP.num_PostCount), 0) as num_PostCount 
from forum_categories C 
left join 
(select count(P.num_Post) as num_PostCount, 
T.num_Thread, T.num_CParent, T.num_Inactive 
from forum_threads T 
left outer join forum_posts P 
on P.num_TParent=T.num_Thread and P.num_Inactive=0 
where T.num_Inactive=0 
group by T.num_Thread) TP 
on C.num_Category=TP.num_CParent and TP.num_Inactive=0 
where C.num_Inactive=0 
group by C.num_Category 
order by C.num_Sticky desc, C.dte_Created desc 
Смежные вопросы