2011-02-01 59 views
0

我这样做了,有一个非常基本的表结构在MySQL数据库中建立了自己的论坛,一个部门的一些工作:MySQL查询:获取最新的论坛后

每一个职位属于一个线程,每个线程属于一个类别。还有一个用户表作者信息。

TABLE category: 
id (int) 
name (varchar) 

TABLE thread: 
id (int) 
category_id (int) 
user_id ((int) 
title (varchar) 
last_post (int) -- logs a unix timestamp of the last posts insertion 

TABLE post: 
id (int) 
user_id (int) 
thread_id (int) 
post (longtext) 
timestamp (int) 

TABLE users: 
id (int) 
username (varchar) 

我试图创建一个页面,显示用户已张贴在(消息仅一次所有线程,因此如果用户已张贴INT线程3次应该还是显示只有一次列表)以及添加到每个线程中的最新帖子。

因此,这些都是我想选择字段:
类别名称
类别编号
主题标题
线程ID
最近添加的消息的消息ID线程
消息最近添加到该线程的消息的文本
作者最近添加到该线程的消息的用户ID
作者最近添加到该线程的消息的用户名
最近添加的消息发布的时间

它可以按线程的最近活动进行排序。

这是可能的一个查询?显然,一种简化这种方式的方法是查询用户发布消息的所有线程,然后为每个线程发送单独的查询以获取最近添加的发布信息。

谢谢!

+0

我没有看到任何关联category - > thread - > post的候选列。你的外键关系是什么? – 2011-02-01 16:21:34

+0

哦,男人。抱歉。我把它留在了外面......线程的category_id引用了分类表和发布的thread_id引用了线程表。希望有帮助..谢谢(我编辑了上面的帖子)。 – SqlSoul 2011-02-01 16:26:16

回答

1

未经检验的,但应该这样做:

SELECT DISTINCT 
c.name 
, c.id 
, t.title 
, t.id 
, p.id 
, p.post 
, u.id 
, u.username 
, FROM_UNIXTIME(p.`timestamp`) AS postDate 
FROM 
category c 
INNER JOIN thread t ON t.category_id = c.id 
INNER JOIN post p ON p.thread_id = t.id 
INNER JOIN users u ON u.id = p.user_id 
INNER JOIN users u2 ON u2.id = p.user_id 
WHERE 
u2.id = userID_whose_threads_are_to_display 
AND p.timestamp = (SELECT MAX(`timestamp`) FROM post WHERE post.thread_id = p.thread_id) 
ORDER BY postDate DESC 

请注意,这是恕我直言,一个坏主意,名称,如数据类型的列(在你的情况时间戳,这就是为什么我把它放在``)。