Mysql 使用一个查询从数据库获取多线程及其最新帖子
我想用子论坛编写一个论坛代码,需要创建一个子论坛的概述,在html表中显示一个线程的最新帖子 我有两个mysql表: 论坛主题: id int10 福鲁米德int10 标题varchar80 访问级别int2 已锁定枚举“是”、“否” 论坛帖子: id int10 线程ID int10 用户ID int10 发布日期时间 编辑日期时间 消息文本 我的查询如下所示:Mysql 使用一个查询从数据库获取多线程及其最新帖子,mysql,Mysql,我想用子论坛编写一个论坛代码,需要创建一个子论坛的概述,在html表中显示一个线程的最新帖子 我有两个mysql表: 论坛主题: id int10 福鲁米德int10 标题varchar80 访问级别int2 已锁定枚举“是”、“否” 论坛帖子: id int10 线程ID int10 用户ID int10 发布日期时间 编辑日期时间 消息文本 我的查询如下所示: SELECT * FROM `forum_threads` LEFT JOIN `forum_post` ON (forum_pos
SELECT * FROM `forum_threads` LEFT JOIN `forum_post`
ON (forum_post.threadid = forum_threads.id)
WHERE forumid='$secfid'
AND accesslevel<='$secuserlevel'
ORDER BY forum_post.posted DESC
LIMIT $qStart,$ppp
其中$secfid是子论坛的id
我的问题是,结果集包含所有帖子,因此,每个线程包含的帖子数量是其帖子数量的两倍。
每个线程应该只存在一次,并且在结果行中只有最新的帖子
我可以用一个附加的子查询来解决这个问题,但我想问问是否有更好的方法来解决这个问题
我在stackoverflow上也发现了类似的内容:
SELECT * FROM `forum_post` fp
JOIN `forum_threads` ft
ON (fp.threadid = ft.id) WHERE forumid=1
AND accesslevel<='100'
AND NOT EXISTS (
SELECT * FROM forum_post fp2
JOIN forum_threads ft2
ON fp2.threadid = ft2.id
WHERE ft.forumid = ft2.forumid
AND fp.posted < fp2.posted
) LIMIT 0,20
这将返回所有所需的信息,但仅来自具有最新帖子的线程。我将通过加入从每个线程检索最新帖子的子选择来完成此操作 子选择将返回每个线程中的最新发布日期。然后可以使用它来获取线程和post数据:
SELECT
thread.title,
post.text
FROM
forum_thread thread
-- Get latest post from each thread
JOIN (
SELECT
MAX(post.posted) as posted,
post.threadid
FROM
forum_post post
JOIN
forum_thread thread
ON
post.threadid = thread.id
-- Limit the forum and security levels
WHERE
thread.forumid = '$secfid'
AND thread.accesslevel <= '$secuserlevel'
GROUP BY
post.threadid
) latest_post
ON
thread.id = latest_post.threadid
-- Get post data for the latest post
JOIN
forum_post post
ON
latest_post.threadid = post.threadid
AND latest_post.posted = post.posted
LIMIT
$qStart, $ppp;
非常感谢。这非常接近我想要的。我现在唯一的问题是,我得到了一个错误:1054-未知列“latest_post.posted”在“on子句”中当我使用MAX.Ups时,忘记将别名添加到MAX函数中。现在应该可以将MAXpost.postedas posted添加到子选择中。