На самом деле, форум я не пишу, но задача схожая.
Есть набор категорий (около 30 штук).
В каждой категории создаются темы.
Нужно вывести список категорий, в котором, помимо всего прочего, должна быть ссылка на последнюю тему.
Хотел сделать всё сам - куда там! Второй день мучаюсь, ищу по форумам, курю доки и копаю чужые сорцы... Хотел вытащить этот кусок из вбуллетня, но его разработчики поступили хитрее - они хранят название и айди последней темы прямо в таблице форумов.
Вот структура моих таблиц (упростил под данный вопрос):
CREATE TABLE `categories` (
`category_id`smallint(6) unsigned NOT NULL auto_increment,
`title` varchar(100) NOT NULL default \'\',
PRIMARY KEY (`category_id`),
);
CREATE TABLE `topics` (
`topic_id` smallint(6) unsigned NOT NULL auto_increment,
`category_id` smallint(6) unsigned NOT NULL default \'0\',
`title` varchar(100) NOT NULL default \'\',
`timestamp` bigint(20) NOT NULL default \'0\',
PRIMARY KEY (`topic_id`),
);
Я не буду перечислять все запросы, котороые я перепробовал за эту пару дней. Покажу только последний:
SELECT c.category_id, c.title, t.topic_id, t.title
FROM categories AS c
LEFT JOIN yn_topics AS t ON (c.category_id = t.category_id)
GROUP BY t.topic_id (пробовал и t.category_id)
Запрос возвращает либо все категории, но топики не последние, а первые; либо возвращает все категории (по нескольку раз каждую) + все топики в порядке возрастания таймстемпа. Ещё игрался с ORDER BY t.timestamp DESC (в оригинале у меня стоит ORDER BY c.left, потому что категории лежат в виде nested sets), но оно тоже не дало нужный результат.
Кажется мне, что тут пригодилась бы та директива, о которой я до сих пор не имею ни малейшего представление - HAVING.
Признаться честно, мануал по мускулю для меня до сих пор остается темным лесом - имхо, читать его очень неудобно. Если ответ на мой вопрос есть в нём, ткните, пожалуйста, в конкретное место.