Таблица категорий:
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 и делать так как сделано там.
Правильным подходом будет сделать в таблице 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 написал(а):
Да с вами солидарен насчет дополнительных полей, но думал что можно и без этого обойтись

Спустя 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) |
Извини, а так не пробовал:
Или так не будет работать? Поправьте меня если не так. Просто сам еще "зеленый" |
Нет, к сожалению так работать не будет!
Спустя 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
у меня такой вариант работает....
только не знаю долга ли будет выполнятся запрос при большом кол-ве записей....
_____________