MySQL查询重复返回结果求助:获取关注者及自身帖子去重问题
解决SQL查询返回重复帖子的问题
嘿,我来帮你搞定这个重复帖子的问题!先给你分析下原因:你的查询同时关联了users、posts和followers三张表,当匹配你自己的帖子(posts.user_id = :userid)时,这条帖子会和followers表中所有follower_id = :userid的记录做笛卡尔积——举个例子,如果你关注了5个人,你自己的每篇帖子就会被重复返回5次。另外,如果某个被关注用户存在多条关注记录(虽然这种情况很少见),他们的帖子也会重复出现。
下面给你几种可行的解决方案,按推荐程度排序:
方案1:用IN子句重构查询(最推荐)
这种写法逻辑更清晰,从根源避免了重复的产生,性能也更优:
SELECT posts.id, posts.body, posts.posted_at, posts.postimg, posts.likes, users.username FROM posts JOIN users ON users.id = posts.user_id WHERE posts.user_id = :userid OR posts.user_id IN (SELECT user_id FROM followers WHERE follower_id = :userid) ORDER BY posts.posted_at DESC;
简单说,这个查询先筛选出你自己的帖子,再筛选出所有你关注用户的帖子(通过子查询获取你关注的用户ID列表),两种结果合并后自然不会有重复。
方案2:添加DISTINCT去重(快速临时解决)
如果不想大改查询结构,直接给SELECT加上DISTINCT关键字,让数据库自动去掉完全重复的行:
SELECT DISTINCT posts.id, posts.body, posts.posted_at, posts.postimg, posts.likes, users.username FROM users, posts, followers WHERE (posts.user_id = followers.user_id OR posts.user_id = :userid) AND users.id = posts.user_id AND follower_id = :userid ORDER BY posts.posted_at DESC;
这种方法适合快速修复问题,但本质是“事后去重”,如果后续查询字段有变化(比如实时更新的点赞数),可能会出现预期外的情况,所以更推荐方案1。
方案3:用GROUP BY按帖子ID分组
通过分组确保每个帖子只返回一次,适合需要关联followers表其他信息的场景:
SELECT posts.id, posts.body, posts.posted_at, posts.postimg, posts.likes, users.username FROM posts JOIN users ON users.id = posts.user_id LEFT JOIN followers ON posts.user_id = followers.user_id AND follower_id = :userid WHERE posts.user_id = :userid OR followers.user_id IS NOT NULL GROUP BY posts.id, posts.body, posts.posted_at, posts.postimg, posts.likes, users.username ORDER BY posts.posted_at DESC;
这里通过GROUP BY posts.id(帖子唯一ID)来强制每个帖子只出现一次,同时用LEFT JOIN确保不会漏掉自己的帖子。
内容的提问来源于stack exchange,提问作者ivan savvidis
相关产品推荐
相关产品推荐

