我在这么多的主题上搜索,但我无法适用于我的查询。 这就是:通过特定的MAX(字段)组合后返回记录
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的数据; intead,我想用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;
希望有人能帮帮我!
所以你想要的最新日期基于什么forum_message的行?也就是说,按主题最新的日期? – Thomas 2011-05-06 23:56:39
我有一个每个主题的消息列表,对吧?它必须打印:每个类别的标题,该类别的主题数量,该类别所有主题的回复数量(这里还有另一个条件,正如你所看到的,该回复的计数器是通过消息得到的与提交的原始= 0)和该类别的最后一条消息的作者/数据...是啊不是一个基本的查询:) – kwichz 2011-05-07 00:00:51
可能重复[分组时问题](http://stackoverflow.com/questions/5917876/problem-when-grouping) – Thomas 2011-05-07 00:03:59