【发布时间】:2012-07-23 06:55:26
【问题描述】:
Codeigniter; Active Records Class
从那个话题,我问了一个关于 CodeIgniter 的问题,我想现在完全原始地做它。
这是我当前的查询。
SELECT `forums`.*,
Count(topics.id) threads,
Count(replies.id) replies,
`users`.`url` user_url,
`users`.`name` user_name,
`ranks`.`name` user_rank
FROM (`forums`)
LEFT JOIN `topics` ON `topics`.`f_id` = `forums`.`id`
LEFT JOIN `replies` ON `replies`.`t_id` = `topics`.`id`
LEFT JOIN `users` ON `users`.`id` = `topics`.`a_id`
LEFT JOIN `ranks` ON `users`.`status` = `ranks`.`id`
LEFT JOIN (
SELECT `topics`.`url` topic_url, `topics`.`name` topic_name
FROM `topics`
ORDER BY `created` DESC
LIMIT 1
) last_post ON `topics`.`f_id` = `forums`.`id`
GROUP BY `forums`.`id`
所以我要做的就是把所有东西都放在一个漂亮的行中。 “最后发帖者”旁边的所有内容都正常工作,如果我删除后来添加的LEFT JOIN,我会得到第一个,而不是最后一个帖子。
所以我的问题是;我现在做错了什么?
另外,一个额外的问题,我之前和一个朋友谈过,他在 PHP 和 MySQL 方面比我更了解,他告诉我把它全部存储在数据库中,last_post 以及计数线程和回复。
提前致谢。
更新
这是论坛表格
CREATE TABLE IF NOT EXISTS `forums` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`c_id` int(11) NOT NULL,
`url` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`desc` text NOT NULL,
PRIMARY KEY (`id`),
KEY `url` (`url`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;
这是主题表
CREATE TABLE IF NOT EXISTS `topics` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`f_id` int(11) NOT NULL,
`url` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`desc` varchar(255) NOT NULL,
`body` text NOT NULL,
`a_id` int(11) NOT NULL,
`created` int(11) NOT NULL,
`edited` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `head` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;
我也尝试过用markdown编辑来更新它的显示方式,就像我第一次做的那样,我希望这更有吸引力。
【问题讨论】:
-
我鼓励您查看 Markdown 帮助以了解未来的问题、答案甚至 cmets。遵循此建议将对您在 StackOverflow 上的体验产生积极影响。谢谢。
-
最后一个
JOIN中的LIMIT 1导致了您的问题。它只返回一条记录(并且总是相同的记录),然后用于查询的其余部分。如果不知道您的表结构,将很难进一步帮助您。
标签: php mysql join aggregate-functions