我正在为一个部门工作,该部门在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)
我正在尝试创建一个页面,该页面将显示用户已发布消息的所有线程(仅一次,因此,如果用户已经在线程中发布了3次,则它仍应在列表中仅显示一次)并且最新帖子添加到每个帖子中。
所以这些是我试图选择的字段:
类别名称
类别标识
主题标题
线程ID
最近添加到该线程的消息的消息ID
最近添加到该线程的消息的消息文本
作者的最近添加到该帖子的消息的用户ID
作者最近添加到该帖子的消息的用户名
最近添加的消息发布的时间
它可以通过线程的最新活动来排序。
这可以在一个查询中使用吗?显然,简化这种方法的方法是查询用户在其中发布消息的所有线程,然后为每个线程发送单独的查询以获取最近添加的帖子信息..
谢谢!
答案 0 :(得分: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
请注意,将列命名为数据类型(在您的情况下为时间戳,这就是为什么我将其放在``中)是一个坏主意。