我想获取我和我的朋友发来的所有帖子。但是此查询甚至向没有朋友的用户显示帖子。
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
答案 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)
评论后说它不起作用......让我们分解它:
OR
user_ID表示您的所有帖子以及您的朋友。我不明白为什么这不起作用。所以我需要一个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)