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

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

我想用子论坛编写一个论坛代码,需要创建一个子论坛的概述,在html表中显示一个线程的最新帖子

我有两个mysql表:

论坛主题:

id int10 福鲁米德int10 标题varchar80 访问级别int2 已锁定枚举“是”、“否”

论坛帖子:

id int10 线程ID int10 用户ID int10 发布日期时间 编辑日期时间 消息文本

我的查询如下所示:

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添加到子选择中。