Php 在MySQL中为留言板获取正确的最大结果,但不是正确的计数值

Php 在MySQL中为留言板获取正确的最大结果,但不是正确的计数值,php,mysql,count,left-join,Php,Mysql,Count,Left Join,这是我第一次来这里。我正在尝试使用PHP和MySQL构建一个留言板(论坛)。我想在PHP中显示一个包含以下信息的表: 一列显示所有当前论坛 另一列显示每个线程和帖子的总数 论坛 显示最新创建的线程的最后一列 这是我的查询,它返回正确的最新线程,但不是正确的计数: SELECT forums.*, threads.thread_id, threads.thread_topic, threads.user_id, users.u

这是我第一次来这里。我正在尝试使用
PHP
MySQL
构建一个留言板(论坛)。我想在
PHP
中显示一个包含以下信息的表:

  • 一列显示所有当前论坛
  • 另一列显示每个线程和帖子的总数 论坛
  • 显示最新创建的线程的最后一列
  • 这是我的查询,它返回正确的最新线程,但不是正确的计数:

    SELECT 
           forums.*,
           threads.thread_id,
           threads.thread_topic,
           threads.user_id,
           users.user_name, 
           threads.thread_date, 
           COUNT(DISTINCT threads.thread_id) AS thread_count,
           COUNT(DISTINCT posts.post_id) AS post_count
       FROM forums 
       LEFT OUTER JOIN threads
          ON forums.forum_id = threads.forum_id
          AND threads.thread_date = 
             (SELECT MAX(threads.thread_date) AS last_topic
                 FROM threads 
                 WHERE forums.forum_id = threads.forum_id)
       LEFT JOIN users 
          ON users.user_id = threads.user_id
       LEFT JOIN posts 
          ON threads.thread_id = posts.thread_id
       GROUP BY forums.forum_id
    
    这些是帖子和帖子计数的结果,它只计算每个论坛最新帖子中的帖子和帖子:

    post count  thread count
        -             -
        7             1
        1             1
        1             1
        1             1
        0             0
    
    SELECT 
           COUNT(DISTINCT posts.post_id) AS post_count, 
           COUNT(DISTINCT threads.thread_id) AS thread_count
       FROM forums 
       LEFT OUTER JOIN threads 
          ON threads.forum_id = forums.forum_id
       LEFT JOIN posts 
          ON threads.thread_id = posts.thread_id
       GROUP BY forums.forum_id;
    
    此查询获取每个论坛的正确帖子和线程数:

    post count  thread count
        -             -
        7             1
        1             1
        1             1
        1             1
        0             0
    
    SELECT 
           COUNT(DISTINCT posts.post_id) AS post_count, 
           COUNT(DISTINCT threads.thread_id) AS thread_count
       FROM forums 
       LEFT OUTER JOIN threads 
          ON threads.forum_id = forums.forum_id
       LEFT JOIN posts 
          ON threads.thread_id = posts.thread_id
       GROUP BY forums.forum_id;
    
    每个论坛的帖子和线程数结果应为:

    post count  thread count
            -             -
            7             1
            1             1
            3             2
            1             1
            0             0
    
    我是否可以组合这两个查询,或者修复第一个查询,从而获得正确的输出

    请在您的建议中使用下表:

    用户、线程、论坛、帖子

    我是新来的
    PHP
    MySQL
    ,如果这样做不对,我很抱歉


    非常感谢你的帮助

    由于
    和threads.threaddate=(选择MAX(threads.threaddate)…
    条件,您只计算最新线程。您需要加入一个子查询,以获取每个论坛中最新线程的行。请参阅以了解如何编写子查询。是的,我理解。我只是不确定如何正确设置子查询的格式。谢谢你的链接。是的,看起来很有效。感谢您抽出时间写出解决方案!
    SELECT
        forums.*,
        counts.thread_count,
        counts.post_count,
        threads.*,           -- last thread
        users.*              -- user of last thread
    FROM forums
    LEFT JOIN (
        SELECT 
            forums.forum_id,
            COUNT(DISTINCT threads.thread_id) AS thread_count,
            COUNT(DISTINCT posts.post_id) AS post_count
        FROM forums 
        LEFT JOIN threads ON threads.forum_id = forums.forum_id
        LEFT JOIN posts ON posts.thread_id = threads.thread_id
        GROUP BY forums.forum_id
    ) counts ON counts.forum_id = forums.forum_id
    LEFT JOIN (
        SELECT
            forums.forum_id,
            threads.thread_id,
        FROM forums
        JOIN threads ON forums.forum_id = threads.forum_id
        AND threads.thread_date = 
            (SELECT MAX(threads.thread_date) AS last_topic
                FROM threads 
                WHERE forums.forum_id = threads.forum_id)
    ) last_thread ON last_thread.forum_id = forums.forum_id
    LEFT JOIN threads ON threads.thread_id = last_thread.thread_id
    LEFT JOIN users ON users.user_id = threads.user_id