Выборка из подфорумов последнего обновления/создания тем

ShadowSnake

Новичок
Выборка из подфорумов последнего обновления/создания тем

Пишу вот такой вот запрос. Но выводит он мне совсем не последние темы/ответы_тем... Скорее всего первые, что были занесены в базу...

PHP:
SELECT elab_forum_threads.*, 
elab_forum_replies.threadid, elab_forum_replies.replyid,
if (MAX(elab_forum_replies.date) is null,elab_forum_threads.date,MAX(elab_forum_replies.date)) AS lastpost
FROM elab_forum_threads LEFT JOIN elab_forum_replies ON elab_forum_threads.threadid=elab_forum_replies.threadid
GROUP BY sectionid
ORDER BY lastpost DESC
Уже второй день думаю как бы это сделать, что б работало.

Раньше делал запрос на каждый подфорум, но получается очень долго...
 

Leksi

Новичок
Re: Выборка из подфорумов последнего обновления/создания тем

Это все потому, что по стандарту в селекте должны быть только поля, которые есть в секции group by. Но Mysql расширил спецификацию и позволил выбирать и другие поля.
Вот что написано в мануале:
Нет необходимости называть имена всех выбранных столбцов в части GROUP BY. Это дает лучшую производительность для некоторых очень специфических, но вполне нормальных запросов.
НО
Не используйте данное свойство, если столбцы, пропущенные в части GROUP BY, не являются уникальными в данной группе! Возможны непредсказуемые результаты.
Вот у тебя и вывелись непредсказуемые результаты.
Используй подзапросы.
 

ShadowSnake

Новичок
Результат предсказуемый вывелся... Точнее вывелись те данные, что заносились в базу первыми... А мне нужны последние... :-(
 

Leksi

Новичок
Попробуй понять и использовать следующую структуру
[SQL]
SELECT t1.*
FROM t1,
(SELECT c1, MAX(c2) AS max_c2 from t1
GROUP BY c1) AS t2
WHERE t1.c1=t2.c1
AND c2= max_c2
[/SQL]
 

ShadowSnake

Новичок
Вот дамп таблиц.
elab_forum_sections - подфорумы
elab_forum_threads - темы подфорумов
elab_forum_replies - ответы

[SQL]
CREATE TABLE `elab_forum_replies` (
`sectionid` int(11) default NULL,
`threadid` int(11) default NULL,
`replyid` int(11) NOT NULL auto_increment,
`replytext` text,
`postedby` int(11) default NULL,
`date` int(11) default NULL,
`replytitle` text,
`postedip` varchar(16) default NULL,
PRIMARY KEY (`replyid`),
KEY `threadid` (`threadid`),
KEY `date` (`date`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

CREATE TABLE `elab_forum_sections` (
`sectionid` int(11) NOT NULL auto_increment,
`sectiontitle` text,
`sectiondescription` text,
`rules_w` tinyint(3) unsigned default NULL,
`rules_collect_posts` tinyint(3) NOT NULL default '0',
`image` varchar(255) default NULL,
PRIMARY KEY (`sectionid`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

CREATE TABLE `elab_forum_threads` (
`sectionid` int(11) default NULL,
`threadid` int(11) NOT NULL auto_increment,
`threadtitle` text,
`threadtext` text,
`postedby` int(11) default NULL,
`date` int(11) default NULL,
`replydate` int(11) unsigned default NULL,
`closed` tinyint(1) unsigned default NULL,
`view_count` int(11) default NULL,
`pinned` tinyint(3) NOT NULL default '0',
`postedip` varchar(16) default NULL,
PRIMARY KEY (`threadid`),
KEY `sectionid` (`sectionid`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
[/SQL]

Необходимо для каждой секции вывести дату последнего обновления, тему в которой было обновление и имя автора
 

Leksi

Новичок
Молодой человек, я не собираюсь писать вам весь запрос.
[SQL]
SELECT `elab_forum_replies`. *
FROM `elab_forum_replies`, (
SELECT `sectionid`, MAX( `date` ) AS 'max_date'
FROM `elab_forum_replies`
GROUP BY `sectionid`
) AS `replies2`
WHERE `relab_forum_replies`.`sectionid` = `replies2`.`sectionid` AND `elab_forum_replies`.`date` = `replies2`.`max_date`
[/SQL]
Но вот запрос, который выводит информацию об ответе с максимальной датой для каждого подфорума. А от него уже и пляшите.
 

ShadowSnake

Новичок
Я и не прошу писать запросы за меня :) Просто пытаюсь разобраться, но не совсем понимаю.

Теперь все стало более-менее понятным.

Результат как говорится на лице :) Огромное спасибо за помощь!
 
Сверху