我想用子论坛编写一个论坛,需要创建一个子论坛的概述,显示html表中线程的最新帖子。
我有两个mysql表:
forum_threads:
id int(10)
forumid int(10)
title varchar(80)
accesslevel int(2)
锁定枚举('是','不')
forum_post:
id int(10)
threadid int(10)
userid int(10)
发布日期时间
编辑日期时间
消息文本
我的查询如下:
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
这将返回所有所需信息,但仅返回具有最新帖子的帖子。
答案 0 :(得分:1)
我会通过加入从每个帖子中检索最新帖子的子选择来实现。
子选择将返回每个帖子中的最新发布日期。然后可以使用它来获取线程和发布数据:
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;