Я знаю, что есть куча нитей, похожих на это, и я просмотрел много, но не смог найти решение. Итак, у меня есть одна таблица под названием «форум», в которой хранятся мои категории (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. Я попытался добавить его в запрос конгломерата, но он не исправил мою проблему. Кто-нибудь знает, что мне нужно сделать, чтобы исправить мой первый запрос?
Звучит так, как будто вы должны переделать свою базу данных. Нить не форум, и сообщение не является нитью и не является форумом. Похоже, вы слишком много забиваете в одном столе. – Corbin
Я ценю ваш вклад, но я подумал о дизайне какое-то время, и это так, как мне бы хотелось. Сначала я подумал о том, чтобы разбить его на три таблицы, но вскоре понял, что столбцы были избыточными, и единственное различие было бы в названии таблиц. – ScubaSteve
@ Корбин прав ... ваш подход все испорчен. Просто потому, что все три таблицы могут иметь одинаковую структуру в терминах столбцов и типа данных, не означает, что они избыточны. Вы говорите о 3 совершенно разных фрагментах данных - Forum, Post и Thread, каждый из которых правильно принадлежит их собственным таблицам. Любые дальнейшие запросы/поиск по вашему дизайну станут излишне сложными и подвержены ошибкам. – GDP