mysql查询中的多个连接

时间:2013-12-13 14:28:29

标签: php mysql sql

我正在制作一个模拟推特网站,对于主要订阅源,我正在尝试查询我的数据库中的所有帖子,并从有人跟随的用户转发,其中$ 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";

2 个答案:

答案 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}}可能仍然存在问题。我在查询分析器中运行查询以确定您是否获得了预期的结果。