MySQL LEFT JOIN,INNER JOIN等,复杂的查询,PHP + MySQL的论坛

时间:2010-12-23 20:14:10

标签: php mysql forum

所以我有一个小论坛,我正在尝试获取数据,有4个表,论坛,forum_posts,forum_threads和用户。我想要做的是获取每个论坛的最新帖子,并让用户偷看该帖子,我想获得每个论坛中的帖子数量和主题数量。另外,我想在一个查询中执行此操作。所以这就是我想出的:

SELECT lfx_forum_posts.*, lfx_forum.*, COUNT(lfx_forum_posts.pid) as posts_count,
    lfx_users.username,
    lfx_users.uid,
    lfx_forum_threads.tid, lfx_forum_threads.parent_forum as t_parent, 
    lfx_forum_threads.text as t_text, COUNT(lfx_forum_threads.tid) as thread_count
    FROM
    lfx_forum
    LEFT JOIN
    (lfx_forum_threads
        INNER JOIN
        (lfx_forum_posts
            INNER JOIN lfx_users
            ON lfx_users.uid = lfx_forum_posts.author)
        ON lfx_forum_threads.tid = lfx_forum_posts.parent_thread AND lfx_forum_posts.pid = 
                (SELECT MAX(lfx_forum_posts.pid)
                FROM lfx_forum_posts
                WHERE lfx_forum_posts.parent_forum = lfx_forum.fid
                GROUP BY lfx_forum_posts.parent_forum)
    )
    ON lfx_forum.fid = lfx_forum_posts.parent_forum
    GROUP BY lfx_forum.fid
    ORDER BY lfx_forum.fid ASC

这是每个论坛的最新帖子,并给我一个偷偷摸摸的问题,那就是

lfx_forum_posts.pid = 
                    (SELECT MAX(lfx_forum_posts.pid)
                    FROM lfx_forum_posts
                    WHERE lfx_forum_posts.parent_forum = lfx_forum.fid
                    GROUP BY lfx_forum_posts.parent_forum)

使我的COUNT(lfx_forum_posts.pid)变成一个(以及COUNT(lfx_forum_threads.tid),这不是我希望它工作的方式。我的问题是:是否有一些简单的方法让它显示正确的号码,同时获取正确的帖子信息(最新的信息)?

如果有什么不清楚请告诉我,我会尝试进一步解释我的问题,这是我第一次在这里发帖。

3 个答案:

答案 0 :(得分:0)

很难只用一个大的查询来概述表的结构。 您是否考虑过制作视图以便更轻松,更快速地运行查询? 为什么要将它保存在一个查询中?就个人而言,我发现通过将过于复杂的查询分成更多部分,您通常可以获得性能和代码可读性。

但很难得到概述所以无法真正给出你的问题的好答案:)

答案 1 :(得分:0)

只需在表格中添加num_posts列即可。不要用COUNT()计算帖子。

答案 2 :(得分:0)

我们能得到一些......

Show Tables;
Desc Table lfx_forum_posts;
Desc Table lfx_forum_threads;
Desc Table lfx_forum_users;
Desc Table lfx_forum;

这是一些伪代码

select f.*, (select count(*) from forum_posts fp where fp.forum_id =  f.id) as num_posts,
(select count(*) from forum_threads ft where ft.forum_id =  f.id) as num_threads,
(select max(fp.id) from forum_posts fp  
where fp.id = f.id
) as latest_post_id,
from forums f;

然后继续在单独的查询中使用latest_post_id来获取它的信息。

如果它在声明之前不喜欢使用f,那么为此创建一个临时表,然后每次运行查询时都会更新。