[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Подсчет количество тем и сообщений
Reverent
Добрый день, в данный момент пишу форум, и столкнулся с такой задачей. Нужно вывести количество тем и сообщений добавленных для данного раздела. У меня есть таблицы:

Таблица категорий:
CREATE TABLE forumSections
(
id_forumSections MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,

name VARCHAR(255) NOT NULL,
weight SMALLINT,

PRIMARY KEY(id_forumSections)

)
ENGINE=MyISAM DEFAULT CHARSET=cp1251;


Таблица подкатегорий:
CREATE TABLE forumSubSections
(
id_forumSubSections MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
id_forumSections MEDIUMINT(8) UNSIGNED NOT NULL,

name VARCHAR(255) NOT NULL,
weight SMALLINT,
description VARCHAR(255),

PRIMARY KEY(id_forumSubSections),
INDEX(id_forumSections)
)
ENGINE=MyISAM DEFAULT CHARSET=cp1251;


Таблица тем:
CREATE TABLE forumThemes
(
id_forumThemes MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
id_forumSubSections MEDIUMINT(8) UNSIGNED NOT NULL,
id_users MEDIUMINT(8) UNSIGNED NOT NULL,
id_forumMessages_last MEDIUMINT(8) UNSIGNED,

header VARCHAR(100) NOT NULL,
shows MEDIUMINT(8) UNSIGNED,

PRIMARY KEY(id_forumThemes),
INDEX(id_forumSubSections),
INDEX(id_users),
INDEX(id_forumMessages_last)
)
ENGINE=MyISAM DEFAULT CHARSET=cp1251;


Таблица сообщений
CREATE TABLE forumMessages
(
id_forumMessages MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
id_forumThemes MEDIUMINT(8) UNSIGNED NOT NULL,
id_users MEDIUMINT(8) UNSIGNED NOT NULL,

message TEXT(5000) NOT NULL,
dateAndTimeAdd DATETIME NOT NULL,
dateAndTimeEdit DATETIME,

picture MEDIUMBLOB,
picture_format VARCHAR(255),

PRIMARY KEY(id_forumMessages),
INDEX(id_forumThemes),
INDEX(id_users)
)
ENGINE=MyISAM DEFAULT CHARSET=cp1251;


Соответственно я хочу вывести таблицу, которая содержала бы название подкатегории, количество тем добавленных в нее, и количество сообщений которые были бы размещены в ней. Для этого я пишу такой запрос:

SELECT 
forumSubSections.name AS nameSubSections,
COUNT(forumThemes.id_forumThemes) AS countThemes,
COUNT(forumMessages.id_forumMessages) AS countMessage

FROM
forumSections,
forumSubSections
LEFT JOIN forumThemes ON forumSubSections.id_forumSubSections = forumThemes.id_forumSubSections
LEFT JOIN forumMessages ON forumThemes.id_forumThemes = forumMessages.id_forumThemes

WHERE
forumSections.id_forumSections = forumSubSections.id_forumSections

GROUP BY forumSubSections.id_forumSubSections
ORDER BY forumSections.weight, forumSubSections.weight;


Но проблема в том, что мне он возвращает только количество сообщений, т.к. поля countThemes и countMessage совпадают на выходе. Что я делаю не так, как правильно написать запрос?



Спустя 45 минут, 57 секунд (24.03.2010 - 11:46) vagrand написал(а):
У тебя неверный подход к задаче. При твоей структуре таблиц даже если тебе удастся написать нужный запрос то он будет очень медленным.
Правильным подходом будет сделать в таблице forumSubSections два дополнительных поля:
numberTemes, numberMessages и инкрементить в них числа при добавлении темы и месага соответственно. Тогда запрос на вывод того что тебе нужно будет очень простым.

А вообще я бы порекомендовал посмотреть код какого-нибудь готового форума типа phpBB или vBulletin и делать так как сделано там.

Спустя 15 минут, 2 секунды (24.03.2010 - 12:01) sergeiss написал(а):
Цитата (vagrand @ 24.03.2010 - 12:46)
Правильным подходом будет сделать в таблице forumSubSections два дополнительных поля:

С этим согласен.

Цитата (vagrand @ 24.03.2010 - 12:46)
А вообще я бы порекомендовал посмотреть код какого-нибудь готового форума типа phpBB или vBulletin и делать так как сделано там.

Я пробовал в их кодах разобраться... Можно, конечно. Но только гиморно это больно. А уж если программер на уровне начинающего... То и вообще не реально.


Спустя 1 час, 23 минуты, 47 секунд (24.03.2010 - 13:25) Reverent написал(а):
Да с вами солидарен насчет дополнительных полей, но думал что можно и без этого обойтись sad.gif

Спустя 14 часов, 17 минут, 26 секунд (25.03.2010 - 03:43) Mirexzpalich написал(а):
Извини, а так не пробовал:

SELECT
forumSubSections.name AS nameSubSections,
COUNT(forumThemes.id_forumThemes) AS countThemes,
COUNT(forumMessages.id_forumMessages) AS countMessage
FROM
forumSubSections,
forumThemes,
forumMessages
WHERE
forumSubSections.id_forumSubSections=forumThemes.id_forumSubSections AND
forumThemes.id_forumThemes=forumMessages.id_forumThemes

Или так не будет работать?
Поправьте меня если не так. Просто сам еще "зеленый"

Спустя 2 часа, 44 минуты, 59 секунд (25.03.2010 - 06:28) Reverent написал(а):
Цитата (Mirexzpalich @ 25.03.2010 - 11:43)
Извини, а так не пробовал:

SELECT
forumSubSections.name AS nameSubSections,
COUNT(forumThemes.id_forumThemes) AS countThemes,
COUNT(forumMessages.id_forumMessages) AS countMessage
FROM
forumSubSections,
forumThemes,
forumMessages
WHERE
forumSubSections.id_forumSubSections=forumThemes.id_forumSubSections AND
forumThemes.id_forumThemes=forumMessages.id_forumThemes

Или так не будет работать?
Поправьте меня если не так. Просто сам еще "зеленый"

Нет, к сожалению так работать не будет!

Спустя 12 часов, 6 минут, 39 секунд (25.03.2010 - 18:34) Mirexzpalich написал(а):
Почему?

Спустя 7 часов, 55 минут, 13 секунд (26.03.2010 - 02:30) Reverent написал(а):
Разница между моими кодом и твоим не существенна. Только мой будет работать если даже в подкатегории не будет не одной темы! А все остальное то же самое.

Спустя 3 дня, 5 часов, 30 минут, 4 секунды (29.03.2010 - 07:00) maxims написал(а):
SELECT 
s.name AS S_name,
ss.name AS SS_name,
(
SELECT COUNT(id_forumThemes) FROM forumThemes WHERE id_forumSubSections=ss.id_forumSubSections) AS count_thems,
(
SELECT COUNT(`id_forumMessages`) FROM `forumMessages` WHERE `id_forumThemes` IN (SELECT `id_forumThemes` FROM `forumThemes` WHERE `id_forumSubSections`=ss.id_forumSubSections)) AS count_mes

FROM
`forumSections` s,
`forumSubSections` ss


WHERE
s.id_forumSections=ss.id_forumSections

GROUP BY
ss.name


у меня такой вариант работает....
только не знаю долга ли будет выполнятся запрос при большом кол-ве записей....


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.