我正在尝试构建一个查询,为每个帖子检索其各自的图像、评论、喜欢和收藏的数量。所有这些数据都位于单独的关系表中,这些表始终存储帖子的 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
关于mysql - 用mysql连接5个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14276597/