我正在制作一个模拟推特网站,对于主要订阅源,我正在尝试查询我的数据库中的所有帖子,并从有人跟随的用户转发,其中$ user_id是当前登录的人。但它我只运行查询时显示重新发布的帖子。有人可以给我一些如何解决这个问题的建议吗?
$query_feed = "SELECT posts.post, posts.date, users.handle, posts.id, posts.image, users.profile_pic, repost.post_id, repost.user_id
FROM posts
JOIN users ON posts.author_id = users.id
JOIN following ON " . $user_id . " = following.follower_id
JOIN repost ON posts.id = repost.post_id
WHERE (posts.author_id = following.followee_id) OR (repost.user_id = following.followee_id)
ORDER BY posts.id desc";
答案 0 :(得分:0)
这是因为你有一个"内部联接"在重新发布("加入"非常简短的"内部联接"):
JOIN repost ON posts.id = repost.post_id
这样做意味着如果repost
而是尝试"外部联接"或者"左连接"
LEFT JOIN repost ON posts.id = repost.post_id
即使repost
我已经简化了一些表(删除了列),但在这里用SqlFiddle证明了这一点:http://www.sqlfiddle.com/#!2/ee33a
答案 1 :(得分:0)
如果您不希望repost
表删除结果集中的记录,则需要使用外连接。
此外,join
表的following
条件位于where
子句中,where
子句包含join
条件。此外,由于join
的{{1}}条件引用following
中的字段,因此加入顺序不正确。
repost
我不确定MySQL如何准确地处理事情,但是当您执行$query_feed = "SELECT posts.post, posts.date, users.handle, posts.id, posts.image, users.profile_pic, repost.post_id, repost.user_id
FROM posts
JOIN users ON posts.author_id = users.id
LEFT JOIN repost ON posts.id = repost.post_id
JOIN following ON (posts.author_id = following.followee_id) OR (repost.user_id = following.followee_id)
WHERE " . $user_id . " = following.follower_id
ORDER BY posts.id desc";
表连接时,NULL
的{{1}}可能仍然存在问题。我在查询分析器中运行查询以确定您是否获得了预期的结果。