Я ищу в ТАКОМ множестве подобных тем, но не могу применить к своему запросу.Это:
SELECT forum_categories.title, COUNT(DISTINCT forum_topics.id) AS total_topics,
SUM(CASE WHEN forum_messages.original=0 THEN 1 ELSE 0 END) AS total_replies, forum_messages.author,
MAX(forum_messages.date) AS last_message, SUM(CASE WHEN r.user IS NULL THEN 1 ELSE 0 END) to_view
FROM forum_categories
JOIN forum_topics ON forum_topics.category_id=forum_categories.id
LEFT OUTER JOIN (SELECT topic, user FROM forum_visits WHERE user='userA') r ON forum_topics.id=r.topic
JOIN forum_messages ON forum_messages.topic_id=forum_topics.id
GROUP BY forum_categories.id
ORDER BY forum_categories.date
Работает: единственная проблема заключается в том, что возвращают только поле forum_messages.date с данными MAX;Между прочим, я хотел бы вернуть всю строку с этим полем MAX (так, например, автором-ответчиком).
Итак, что я должен вернуть, менее словами:
- заголовок для каждой категории;* ( на данный момент это работает)
- количество тем для этой категории; (на данный момент это работает)
- количество ответов по всем темам этой категории; (здесь, как вы видите, есть еще одно условие, счетчик этих ответов получает сообщение с поданным оригиналом = 0) (на данный момент это работает)
- автор /данные для последнего сообщения для этой категории ( ЗДЕСЬ существует проблема : она возвращает корректно только дату, а не автора);
- флаг, указывающий, есть ли какая-либо тема, которая userA еще не проверено;( также на данный момент работает: если SUM возвращает что-то более высокое, чем 0, есть тема, которая не просматривается)
- предполагается, что этот запрос выполняется как можно быстрее, поскольку таблицы могутбыть очень большим;
Для подробностей, это мои реальные таблицы:
CREATE TABLE IF NOT EXISTS `forum_categories` (
`id` int(11) unsigned NOT NULL auto_increment,
`title` varchar(255) NOT NULL,
`description` varchar(255) NOT NULL,
`date` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `forum_topics` (
`id` int(11) unsigned NOT NULL auto_increment,
`category_id` int(11) unsigned NOT NULL,
`title` varchar(255) NOT NULL,
`author` varchar(255) NOT NULL,
`date` datetime NOT NULL,
`view` int(11) unsigned NOT NULL default '0',
`sticky` tinyint(11) unsigned NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=25 DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `forum_messages` (
`id` int(11) unsigned NOT NULL auto_increment,
`topic_id` int(11) unsigned NOT NULL,
`author` varchar(255) NOT NULL,
`message` mediumtext NOT NULL,
`date` datetime NOT NULL,
`original` tinyint(11) unsigned NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=29 DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `forum_visits` (
`id` int(11) unsigned NOT NULL auto_increment,
`topic` int(11) unsigned NOT NULL,
`user` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `forum_visits_unique_idx` (`topic`,`user`)
) ENGINE=MyISAM AUTO_INCREMENT=131 DEFAULT CHARSET=utf8;
Надеюсь, что кто-то может мне помочь!