我想写一个查询来检索我在应用上的朋友写的所有帖子。
我的表结构是:
Entity:
---------------------
EntityID - PK
FirstName - VARCHAR
LastName - VARCHAR
Friends:
---------------------
FriendID - PK
Friend1 - INT
Friend2 - INT
Post:
---------------------
PostID - PK
EntityId - INT
Message - VARCHAR
上面的模式已经过简化,以演示结构。
到目前为止,我已尝试过以下操作,但它只会检索ID为5
的用户发布的帖子。如何让查询返回此用户及其所有朋友的帖子?
SELECT
P.PostID,
P.Message,
E.FirstName,
E.LastName,
FROM
Entity AS E
JOIN
Friends AS F
ON (E.EntityId = F.Friend1 OR E.EntityId = F.Friend2)
INNER JOIN
Posts AS P
ON P.EntityId = F.Friend1 OR P.Entity_Id = F.Friend2
WHERE
E.EntityId = 5
ORDER BY
P.PostID DESC
如果我有数据集:
FriendId | Friend1 | Friend2 |
1 8 5
2 9 5
3 5 3
4 2 4
PostId | EntityId | Message
1 5 Hello
2 8 Goodbye
3 2 Morning
我希望只返回hello
和goodbye
,因为2
的用户ID与5没有关联,但应返回所有5个帖子。我一直在盯着这一段时间,似乎无法理解它。
答案 0 :(得分:3)
基本上,您只需要一个简单的查询即可获得符合条件的帖子:
select * from post
where entityid in (select friend1 from friends where friend2 = 5 )
or entityid in (select friend2 from friends where friend1 =5)
or entityid = 5;
然后添加你需要的东西:
select p.postid, e.lastname,e.firstname,e.entityid , p.message from post p
join entity e on e.entityid=p.entityid
where p.entityid in (select friend1 from friends where friend2 = 5 )
or p.entityid in (select friend2 from friends where friend1 =5)
or p.entityid = 5;
现在将其更改为加入版本:
select p.postid, e.lastname,e.firstname,e.entityid , p.message from post p
join (
select friend1 from friends where friend2 =5
union select friend2 from friends where friend1 =5
union select 5 from dual) m
on p.entityid = m.friend1
join entity e
on p.entityid=e.entityid;
答案 1 :(得分:1)
SELECT
p.postid
,p.message
,e.firstname
,e.lastname
FROM posts p
INNER JOIN entity e
ON e.entityid = p.entityid
WHERE e.entityid IN (
SELECT friend2
FROM friends
WHERE friend1 = 5
UNION
SELECT friend1
FROM friends
WHERE friend2 = 5
)
返回:
postid message firstname lastname
2 Goodbye John8 Doe8
帖子"你好"由于作者不是用户5的朋友,而是用户5本人,因此不会返回。