使用一个查询从数据库中获取多个线程及其最新帖子

时间:2011-12-22 19:42:52

标签: mysql

我想用子论坛编写一个论坛,需要创建一个子论坛的概述,显示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

这将返回所有所需信息,但仅返回具有最新帖子的帖子。

1 个答案:

答案 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;