MySQL 查询 : Getting the most recent forum post

标签 mysql forum greatest-n-per-group

我正在为一个部门做一些工作,该部门在 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
最近添加到该线程的消息的消息文本
最近添加到该线程的消息的作者的用户 ID
最近添加到该线程的消息的作者用户名
最近添加的消息的发布时间

它可以按线程的最近事件排序。

这可以在一个查询中实现吗?显然,简化此操作的一种方法是查询用户发布消息的所有线程,然后为每个线程发送单独的查询以获取最近添加的帖子信息..

谢谢!

最佳答案

未经测试,但应该可以:

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

请注意,恕我直言,将列命名为数据类型(在您的情况下为时间戳,这就是为什么我将其放在``中)是一个坏主意。

关于MySQL 查询 : Getting the most recent forum post,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4864942/

相关文章:

python - 添加返回类别的链接时出现 NoReverseMatch 错误

MySQL MAX Value 使用 GROUP BY 跳过条目

mysql - 从查询的第二个表中过滤最大日期

sql - Oracle SQL,如何选择组中的第一行?

mysql - 查找有 0 个帖子、1-5 个帖子和 >5 个帖子的用户的平均年龄

MySQL计算每个客户的在线订单与电话订单的百分比

mysql - 我正在使用 mybb,如何找到当前拥有最多读者的前 5 个线程?

PHP SESSIONS 检查用户是否仍在数据库中,同时登录

mysql - 从每 50 行中选择 5 个值的总和并按总和分组

php - 获取线程主题中多个用户的信息