用mysql连接5个表

用mysql连接5个表,mysql,join,Mysql,Join,我正在尝试构建一个查询,为每个帖子检索其各自的图像、评论、喜欢和收藏夹数量。所有这些数据都位于单独的关系表中,这些关系表始终存储帖子的id 但是,当我运行查询时,其他3个页面的数据与第一个页面的数据完全相同 到目前为止,我已经把这个编码了 SELECT * FROM (SELECT pst.* FROM posts as pst LEFT JOIN postcategories as pstcat ON pst.id = pstcat.id_pos

我正在尝试构建一个查询,为每个帖子检索其各自的图像、评论、喜欢和收藏夹数量。所有这些数据都位于单独的关系表中,这些关系表始终存储帖子的id

但是,当我运行查询时,其他3个页面的数据与第一个页面的数据完全相同

到目前为止,我已经把这个编码了

SELECT * FROM
        (SELECT pst.* FROM posts as pst
        LEFT JOIN postcategories as pstcat
        ON pst.id = pstcat.id_post
        WHERE pst.date IS NOT NULL AND pst.date >= '2013-01-01 00:00:00' AND pst.date <= '2013-01-11 00:00:00' ) as res1  
        INNER JOIN
        (SELECT pst.*, count(pstcmt.id) as cmtCount
                        FROM posts as pst
                        LEFT JOIN userpostcomments as pstcmt
                        ON pst.id = pstcmt.id_post 
                        GROUP BY pst.id) as res2 ON res1.id = res2.id
        INNER JOIN
        (SELECT pst.id, count(pstlk.id) as lkCount
                        FROM posts as pst
                        LEFT JOIN userpostlikes as pstlk
                        ON pst.id = pstlk.id_post 
                        GROUP BY pst.id) as res3 ON res1.id = res3.id
        INNER JOIN
        (SELECT pst.id, count(pstfav.id) as favCount
                        FROM posts as pst
                        LEFT JOIN userpostfavorites as pstfav
                        ON pst.id = pstfav.id_post 
                        GROUP BY pst.id) as res4 ON res1.id = res4.id
        INNER JOIN
        (SELECT pst.id, count(pstimg.id) as imgCount
                        FROM posts as pst
                        LEFT JOIN postimages as pstimg
                        ON pst.id = pstimg.id_post 
                        GROUP BY pst.id) as res5 ON res1.id = res5.id

                        WHERE res1.deleted = 0 
                        AND res1.date IS NOT NULL 
                        GROUP BY res1.id
                        ORDER BY res1.date DESC 
多谢各位


更新:按建议使用ORDER BY更新查询。但是,数据镜像问题仍然存在

也许,这就是您想要的:

SELECT pst.id,
      COALESCE(cmtCount, 0) cmtCount,
      COALESCE(lkCount, 0) lkCount,
      COALESCE(pstfavCount, 0) pstfavCount,
      COALESCE(imgCount , 0) imgCount,
FROM posts as pst
        LEFT JOIN 
           (SELECT id_post, count(id) as cmtCount
                FROM userpostcomments GROUP BY id_post) as cmt
            ON pst.id = cmt.id_post
        LEFT JOIN 
           (SELECT id_post, count(id) as lkCount
                FROM userpostlikes GROUP BY id_post) as lk
            ON pst.id = lk.id_post
        LEFT JOIN 
           (SELECT id_post, count(id) as pstfavCount
                FROM userpostfavorites GROUP BY id_post) as pstfav
            ON pst.id = pstfav.id_post
        LEFT JOIN 
           (SELECT id_post, count(id) as imgCount
                FROM postimages GROUP BY id_post) as img
            ON pst.id = img.id_post
 WHERE pst.deleted = 0 
    AND pst.date >= '2013-01-01 00:00:00'
    AND pst.date <= '2013-01-11 00:00:00'
 ORDER BY pst.date DESC 
我认为,这个查询速度更快

SELECT pst.id,
      COUNT(DISTINCT cmt.id) cmtCount,
      COUNT(DISTINCT lk.id) lkCount,
      COUNT(DISTINCT pstfav.id) pstfavCount,
      COUNT(DISTINCT img.id) imgCount,
FROM posts as pst
        LEFT JOIN userpostcomments cmt
            ON pst.id = cmt.id_post
        LEFT JOIN  userpostlikes lk
            ON pst.id = lk.id_post
        LEFT JOIN userpostfavorites  pstfav
            ON pst.id = pstfav.id_post
        LEFT JOIN postimages  img
            ON pst.id = img.id_post
 WHERE pst.deleted = 0 
    AND pst.date >= '2013-01-01 00:00:00'
    AND pst.date <= '2013-01-11 00:00:00'
 GROUP BY pst.id
 ORDER BY pst.date DESC 

使用GROUP BY解决问题您是否尝试使用DISTINCT关键字?DISTINCT和GROUP BY很好地解决了第一页重复记录的问题。但为什么我会在第2、3页得到镜像结果?有多少子查询,这将需要更多的时间在OP postcategories没有正确使用。谢谢。你的查询不起作用。它只输出一组重复的id行,字段上只有1和0。我还检查了每个id中每个字段的计数是否正确,但不幸的是,这不是谢谢!它很好用;奇怪的是,我在性能上没有比查询获得更多的收益,但这不是问题;新查询不按帖子ID进行分段,因为没有分组依据。但正如我所说的,如果不是闪电的话,那就没什么麻烦了。如果您已经为id列上的所有表和id_post上的索引设置了PK,那么它一定会更好。