2013-01-09 73 views
0

我正在建立一个论坛,并且遇到了一些问题。检索每个类别的最新帖子 - 论坛

基本的数据库结构是这样的:

users 
| user_id | username 

categories 
| category_id | category_name | 

forum_posts 
| post_id | ref_post_id (FK) | ref_category_id (FK) | ref_user_id (FK) | post_date | 

如果ref_post_id是0,这意味着它是有一个标题线程的主哨。对于线程的解答ref_post_id等于主帖子的post_id。我希望你明白。

如何获得每个类别的最新帖子?包括帖子主题标题和用户表中的用户名。我应该改变我的表结构,并添加一个“latest_post_id”字段到类别表或什么?

非常感谢您的帮助。我知道有类似的问题,但我也想知道是否应该在类别表中存储latest_post_id和所有内容,或者有一个巨大的查询来检索每个页面加载中的所有内容。

编辑2:这里是我当前的查询:

SELECT category_id, name, 
(SELECT COUNT(*) FROM forum_posts WHERE ref_category_id = category_id AND ref_post_id = 0) count_threads 
(
SELECT title, ref_user_id, username FROM forum_posts 
LEFT JOIN users ON user_id =  ref_user_id 
WHERE latest_post_id = (SELECT MAX(latest_post_id) FROM forum_posts WHERE ref_category_id = category_id LIMIT 1) 
) 
FROM forum_categories 
+0

? – sgeddes

+0

如果这将在论坛列表的每一页加载中显示,那么在论坛表中保存一个缓存的'most_recent_post_id'或类似的东西可能是有意义的。更新新的文章创建/编辑/您选择的任何逻辑。然后,显示最近的帖子与“JOIN”一样简单,而不是多个查询或子查询。 –

回答

0

,如果你有你需要得到一个与MAX日期,如果你没有,你可以使用MAX(创建日期post_id),但如果让用户编辑他们的帖子,并且想要获取创建或编辑的最新创建者,则应该向数据库添加修改日期。

以获得最新的岗位:

SELECT * FROM forum_posts p 
INNER JOIN users u ON p.ref_user_id=u.user_id 
WHERE `post_id`=(SELECT max(`post_id`) FROM forum_posts WHERE ref_category_id=$value); 

如果您使用的是日期,只需使用该字段,而不是post_id您正在使用哪个RDBMS

+0

我将如何获取用户名?和标题?我用我当前的查询更新了我的问题,它不检索最新的帖子。 – lawls

+0

我的查询将检索forum_posts表中的所有内容,如果您想使用FK来获取正常值,则必须使用JOIN。我会用'JOIN'更新我的例子 – Naryl

+0

,你也会得到用户的信息,希望有帮助 – Naryl

相关问题