1

这让我难倒了一段时间。

我的问题:我有 2 个不同的表。一个用于用户帖子的表和一个用于订阅者的表。

订阅者表如下所示:

订阅者 ID -> ProfileID
1 -> 2
1 -> 3
2 -> 3
2 -> 4
3 -> 2

我的帖子表如下所示:

PostID -> AuthorID -> PostDate -> PostBody
1 -> 2 -> 12/20/12 -> Hello Word
2 -> 3 -> 12/21/12 -> Bye Bye World
3 - > 1 -> 12/22/12 -> 哦等等
4 -> 4 -> 12/23/12 -> 有人还在吗?

基本上,它的工作原理是拥有 ID 的用户订阅了 ID 2 和 3 的用户。 ID #2 订阅了 ID #3 和 #4。如果用户订阅了某个用户,他们只能看到他们订阅的人的帖子。现在,我正在使用在类似问题中看到的以下内容:

SELECT POSTS.*
FROM POSTS
JOIN SUBSCRIBERS
ON POSTS.AUTHORID = SUBSCRIBERS.PROFILEID
WHERE SUBSCRIBERS.SUBSCRIBERID = ?
ORDER BY POSTS.POSTID DESC LIMIT 10

这工作正常,但它也不会显示用户的帖子。我试过修改它,但它不起作用:\

如果你想知道,“?” 代表用户的ID

因此,如果可以的话,如果有人能告诉我如何将用户自己的帖子与用户订阅的人的帖子一起包括在内,那就太好了

4

1 回答 1

2

您可以将查询修改为:

SELECT POSTS.*
FROM POSTS
LEFT JOIN SUBSCRIBERS
ON POSTS.AUTHORID = SUBSCRIBERS.PROFILEID
WHERE SUBSCRIBERS.SUBSCRIBERID = ? OR POSTS.AUTHORID = ?
GROUP BY POSTS.POSTID ORDER BY POSTS.POSTID DESC LIMIT 10 

它也选择用户自己的帖子。希望这会有所帮助。

更新:添加GROUP BY POSTS.POSTID了重复项,因为您只在POSTS表中查找数据。

当您像传递值一样运行查询时 - 例如。对于 id 为 1 的用户,查询如下所示:

SELECT POSTS.*
FROM POSTS
LEFT JOIN SUBSCRIBERS
ON POSTS.AUTHORID = SUBSCRIBERS.PROFILEID
WHERE SUBSCRIBERS.SUBSCRIBERID = 1 OR POSTS.AUTHORID = 1 GROUP BY POSTS.POSTID
ORDER BY POSTS.POSTID DESC LIMIT 10

结果是:

PostID  AuthorID    PostDate    PostBody

3       1   2012-12-21  Oh Wait
2       3   2012-12-21  Bye Bye World
1       2   2012-12-20  Hello Word

这是正确将值传递给选择查询时得到的结果。传递给SUBSCRIBERID和的值AUTHORID 应该相同。LEFT JOIN 将解决您的问题。

于 2011-12-21T02:11:51.870 回答