| Вопрос в том как "это" соединить или сократить, а то получается 1 + колво форумов * 2 запросов только для одного вывода главной страницы. Время обработки небольшое довольно таки, но и нагрузка на сервер пока просто не велика.
Есть запрос:
SELECT cat.cid, cat.name as cname, forum.fid, forum.name, forum.desc, forum.c, COUNT( DISTINCT topic.id ) AS topics, COUNT( DISTINCT post.pid ) AS posts
FROM cat
LEFT JOIN forum ON cat.cid = forum.c AND cat.gid = forum.gid
AND cat.gid = forum.gid
LEFT JOIN post ON post.fid = forum.fid AND cat.gid = post.gid
AND cat.gid = forum.gid
LEFT JOIN topic ON post.fid = topic.fid AND cat.gid = topic.gid
AND topic.gid = forum.gid
WHERE forum.gid = 1 (например)
GROUP BY forum.name
ORDER BY forum.c, forum.fid ASC
LIMIT 0, 100
|
он выбирает список форумов, категорий и количество тем и сообщений в них для скрипта форума. С него я делаю главную страницу форума, но потом пришла мысль добавить например "последнее сообщение в форуме", то есть название темы, и ссылка на неё с временм последнего сообщения в ней.
и идет цикл с разбором первого запроса и в нём подзапросы пришлось сделать
$query = "SELECT aid,pid,time,tid FROM `forum`.`post` WHERE gid=".$gid." AND fid=".$id." ORDER BY `time` DESC LIMIT 0,1";
$res = mysql_query($query);
$res = mysql_fetch_assoc($res);
$q = "SELECT name FROM `forum`.`topic` WHERE id=".$res['tid'];
$r = mysql_query($q);
$r = mysql_fetch_assoc($r);
$id = ид форума который сейчас выводиться.
|
Структура таблиц:
--
-- Структура таблицы `cat`
--
CREATE TABLE `cat` (
`gid` tinyint(4) NOT NULL COMMENT 'Номер группы где категория',
`cid` tinyint(3) NOT NULL COMMENT 'Ид категории в форуме группе',
`name` varchar(50) NOT NULL COMMENT 'Имя категории',
`st` varchar(4) NOT NULL default 'OPEN' COMMENT 'Приватность',
KEY `id` (`cid`,`name`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
--
-- Структура таблицы `forum`
--
CREATE TABLE `forum` (
`gid` int(5) NOT NULL COMMENT 'Номер группы гдбе форум',
`c` tinyint(2) NOT NULL COMMENT 'Категория где этот форум',
`fid` tinyint(2) NOT NULL COMMENT 'Ид форума в группе (не зависит от категории и считается (все форумы+1))',
`name` varchar(50) NOT NULL COMMENT 'Название форума',
`desc` varchar(250) NOT NULL COMMENT 'Описание форума',
`st` enum('OPEN','CLOSED') default 'OPEN' COMMENT 'Статус/приватность форума'
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
--
-- Структура таблицы `post`
--
CREATE TABLE `post` (
`gid` int(4) NOT NULL COMMENT 'Номер группы где пост',
`fid` tinyint(4) NOT NULL COMMENT 'Номер форума где пост',
`tid` int(4) NOT NULL COMMENT 'Номер топика, где пост',
`pid` int(4) NOT NULL auto_increment COMMENT 'УНИКАЛЬНЫЙ для всего сайта ид поста',
`aid` int(4) default NULL COMMENT 'Ид автора поста',
`text` text NOT NULL COMMENT 'Текст сообщения',
`time` datetime NOT NULL COMMENT 'Дата/время добавления сообщения в форум',
PRIMARY KEY (`pid`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=120 ;
--
-- Структура таблицы `topic`
--
CREATE TABLE `topic` (
`gid` tinyint(4) NOT NULL COMMENT 'Номер группы, где топик',
`id` tinyint(4) NOT NULL auto_increment COMMENT 'Уникальный для всего сайта ид топика',
`fid` tinyint(4) NOT NULL COMMENT 'Ид форума, где топик',
`aid` tinyint(4) NOT NULL COMMENT 'Ид автора топика',
`name` varchar(100) NOT NULL COMMENT 'Название темы',
`date` datetime NOT NULL COMMENT 'Дата создания темы',
`lasttime` datetime NOT NULL,
`st` enum('OPEN','CLOSE','PRIVATE','TRASH') default NULL COMMENT 'Приватность/статус темы',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=22 ;
|
| |