SQL内部联接未显示预期结果

时间:2015-05-18 14:49:16

标签: mysql sql join

我想获取我和我的朋友发来的所有帖子。但是此查询甚至向没有朋友的用户显示帖子。

SELECT f.user_id,f.friend_id, p.user_id AS Post_BY, p.post_text, p.post_date  
FROM users u 
INNER JOIN friends f USING (user_id) 
INNER JOIN post p USING(user_id)
WHERE f.user_id = 6 
OR f.friend_id = 6
OR p.user_id = f.user_id

2 个答案:

答案 0 :(得分:1)

这应该返回:所有朋友的帖子和你自己的帖子。 它假定朋友表friend_Id是users.user_ID的外键。与p.user_ID绑定。尽管可以从原始帖子中的OR f.friend_id = 6推断出来,但未明确定义friend.friend_Id

我们加入帖子,使用or条件返回您和您的朋友帖子。 我们从用户表中仅限于您。

表的顺序无关紧要,我重新安排了我的想法。

SELECT f.user_id,f.friend_id, p.user_id AS Post_BY, p.post_text, p.post_date  
FROM users u 
INNER JOIN friends f 
  on u.user_id = f.user_id
INNER JOIN post p 
  on f.user_id = P.user_id
  or f.friend_id = p.user_id
WHERE (u.user_id = 6)

评论后说它不起作用......让我们分解它:

  • 用户加入user_Id的朋友应该给你自己和朋友的ID;但是在两个单独的栏目中
  • 加入基于好友的帖子OR user_ID表示您的所有帖子以及您的朋友。
  • Where子句仅限于单个用户和朋友,用户为6。

我不明白为什么这不起作用。所以我需要一个SQL小提琴示例或此时预期结果的示例数据;或者我不明白你在追求什么。

事实上:这是一个SQL fiddle,显示它返回用户和朋友的帖子。在该示例中,用户6具有两个朋友1,2。通知6,1,2个帖子被退回但3个帖子没有。

要处理...我们使用case语句并在原始用户发布的帖子上清空朋友ID。虽然两组的简单结合可能更有效和可维护。

SELECT distinct f.user_id, 
case when u.user_ID = 6 then null else f.friend_id end as Friend_ID, p.user_id as `Post_BY`, p.post_text, p.post_date  
FROM users u 
INNER JOIN friends f 
  on u.user_Id = f.user_Id
INNER JOIN posts p 
  on f.user_ID = P.user_Id
  or f.friend_Id = p.user_ID
WHERE (u.user_id = 6)

答案 1 :(得分:1)

首先,您需要发布帖子,因此请将其作为主要表格。然后,您可以创建一个子选择来查找所有朋友的ID。

SELECT p.user_id AS Post_BY, p.post_text, p.post_date 
FROM post p
WHERE p.user_id = 6
    OR p.user_id IN (SELECT friend_id FROM friends WHERE user_id = 6)

这是最简单的情况,并假设对于朋友关系,朋友表中有两个条目(1> 2 AND 2> 1)。

如果friends表中只有一个条目,则需要向子查询添加另一个查询:

SELECT p.user_id AS Post_BY, p.post_text, p.post_date 
FROM post p
WHERE p.user_id = 6
    OR p.user_id IN (
        SELECT friend_id FROM friends WHERE user_id = 6
        UNION
        SELECT user_id FROM friends WHERE friend_id = 6)