gpt4 book ai didi

php - "Last Post By"用于论坛、加入、加入和加入负载

转载 作者:行者123 更新时间:2023-11-29 08:49:33 25 4
gpt4 key购买 nike

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`

所以我想做的就是将所有内容都整理成一排。 “Last Post By”旁边的所有内容都正常,如果我删除后来添加的LEFT JOIN,我会得到第一个帖子,而不是最后一个帖子。

所以我的问题是;我现在做错了什么?

另外,还有一个额外的问题,我之前和一位 friend 聊过,他在 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 编辑显示方式,就像我第一次做的那样,我希望这更有吸引力。

最佳答案

这里有一个解决方案。我不认为这是最有效的解决方案,但它应该有效。请注意,我将 Topics SELECT 移至第一个 SELECT 行。

SELECT `forums`.*, 
Count(topics.id) threads,
Count(replies.id) replies,
`users`.`url` user_url,
`users`.`name` user_name,
`ranks`.`name` user_rank,
(SELECT `topics`.`url`
FROM `topics`
WHERE `topics`.`f_id` = `forums`.`id`
ORDER BY `created` DESC LIMIT 1) topic_url,
(SELECT `topics`.`name`
FROM `topics`
WHERE `topics`.`f_id` = `forums`.`id`
ORDER BY `created` DESC LIMIT 1) topic_name
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`
GROUP BY `forums`.`id`

可能更有效的方法

我没有数据来测试这是否更快,但这是另一种方法(我基于 ROW_NUMBER() in MySQL 。)这附加了一个字符串,那就是 topics 表不能有重复的 f_idcreated 组合:

SELECT `forums`.*, 
Count(topics.id) threads,
Count(replies.id) replies,
`users`.`url` user_url,
`users`.`name` user_name,
`ranks`.`name` user_rank,
t.url topic_url,
t.name topic_name
FROM (`forums`)
LEFT JOIN (SELECT t0.id, t0.f_id, t0.url, t0.name, t0.a_id
FROM topics AS t0
LEFT JOIN topics AS t1 ON t0.f_id=t1.f_id AND t1.created>t0.created
WHERE t1.id IS NULL) AS t
ON t.f_id = forums.id
LEFT JOIN `replies` ON `replies`.`t_id` = t.`id`
LEFT JOIN `users` ON `users`.`id` = t.`a_id`
LEFT JOIN `ranks` ON `users`.`status` = `ranks`.`id`
GROUP BY `forums`.`id`

尝试一下,首先看看它是否有效,然后看看它是否更快。我很想收到您的回复。

关于php - "Last Post By"用于论坛、加入、加入和加入负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11639631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com