PHP-Join语句复制记录

PHP-Join语句复制记录,php,mysql,sql,pdo,inner-join,Php,Mysql,Sql,Pdo,Inner Join,我有一个相当大的查询,它基本上向我的用户显示了我存储在数据库中的不同论坛: $stmt = $dbh->prepare(" SELECT c.forum_id as category_id, c.forum_name as category_name, t.forum_id as id, t.forum_name as name, t.forum_desc as description,

我有一个相当大的查询,它基本上向我的用户显示了我存储在数据库中的不同论坛:

    $stmt = $dbh->prepare("
    SELECT 
        c.forum_id as category_id,
        c.forum_name as category_name,
        t.forum_id as id,
        t.forum_name as name,
        t.forum_desc as description,
        (SELECT COUNT(*) FROM forum_topics WHERE forum_id=t.forum_id AND topic_deleted=0) as topics_count,
        (SELECT COUNT(*) FROM forum_posts WHERE forum_id=t.forum_id AND post_deleted=0) as posts_count,
        (SELECT COUNT(*) FROM forum_posts WHERE topic_id=lp.topic_id AND post_deleted=0) as last_post_count,
        lp.topic_id as last_post_topic_id,
        lp.topic_title as last_post_topic_title,
        lp.post_time as last_post_time,
        lp.username as last_post_username
    FROM forum_cats as t
    JOIN forum_cats as c on c.forum_id = t.forum_type_id
    left join (
        SELECT 
            ft.topic_id,
            ft.title as topic_title,
            tmp.post_time,
            u.username,
            fp.forum_id
        FROM
            forum_posts fp
            join forum_topics ft on ft.topic_id = fp.topic_id
            join users u on u.id = fp.userid
            join (
                select forum_id, max(`post_time`) `post_time`
                from forum_posts fp
                where fp.post_deleted = 0
                group by forum_id
                ) as tmp on (fp.forum_id = tmp.forum_id and fp.post_time = tmp.post_time)
        where post_deleted = 0 and ft.topic_deleted = 0
    ) as lp on lp.forum_id = t.forum_id
    where t.forum_active = 1 and c.forum_active = 1
    order by category_id, t.forum_id
");

    $stmt->execute();
然后我执行while循环以显示所有记录:

while (($row = $stmt->fetch())) {
echo $row['name']; 
}
问题是,在while循环中,我有时会得到很好的结果

应该是这样的:

forum1
forum2
forum3
forum4
forum5
forum6
forum1
forum1
forum1
forum1
forum2
forum3
forum4
forum5
forum6
等等

但有时我会得到这样的结果:

forum1
forum2
forum3
forum4
forum5
forum6
forum1
forum1
forum1
forum1
forum2
forum3
forum4
forum5
forum6
有些行是非常随机的,哪一行被“复制”

有人能帮我解释一下吗?

尝试通过添加t.forum\u id分组:


据推测,查询SELECT t.forum\u id FROM forum\u topics t会产生相同的错误?@草莓你想详细说明一下吗?只是一个猜测,但是。。。我想说的是,你的第三个加入子查询,它会在主查询上带来帖子,这会造成重复,因为你可能在一个论坛上有很多帖子。你能单独运行子查询吗?你把它命名为lp并检查是否有重复的forum\u id字段?只是想确定问题是在PHP还是MySQL中。这个连接看起来很奇怪:从forum\u cats作为t join forum\u cats作为c on c.forum\u id=t.forum\u type\u id。什么是forum\u cats类别?,为什么您需要通过论坛id和类型id来加入该表?它看起来像是一个错误,即使不是,也可能返回重复的。或者将第一次选择更改为“选择不同”。毕竟,如果没有什么可聚合的,你为什么要分组?无论哪种方式,这都将消除症状,但在许多情况下,意外的重复行表示需要解决的错误。现在,您只是在抑制症状。如果确实添加了GROUP BY,则应在ORDER BY之前添加。