我有一个有线程,帖子和用户的讨论区。
所以现在我需要创建一个连接,这样,对于给定的用户,我可以获得一个未读帖子的线程表。
如何创建正确的联接?用户,帖子和帖子当然都有一个主键ID,它们记录在查询表中,即
TABLE `posts_read`
user | has_read_post | of_thread
---------------------------------
5 | 100 | 3
和
TABLE `subscribed_to`
user | reads_thread
---------------------
5 | 3
示例:用户5订阅了线程3,并且已经读取了帖子100的帖子3,但是线程3现在有200个帖子,用户想要在帖子中开始阅读帖子3 101因为她落后了100个帖子。
我可以一步完成吗?当然,她可能会订阅多个线程,因此我们应该按哪个线程排序最多。
答案 0 :(得分:1)
这是解决问题的可能方法。我假设posts_read.has_read_post等于读取的帖子数,而不是唯一标识所有线程中的帖子的数字。如果它是一个唯一的帖子标识符,那么事情就更难了。
首先创建一个返回两列的查询。列是用户订阅的每个线程的线程号。第二列是该主题中的帖子数。
这应该是一个相当容易的设计查询。我假设查询返回名为'thread'和'posts'的列。
现在我们基于包含每个此类线程的未读消息的查询创建一个新查询。我假设我们对用户编号5感兴趣。您需要替换已经为OtherQuery编写的查询(但保留括号)。
SELECT other.thread, (other.posts - COALESCE(posts_read.has_read_post,0) )
AS UnreadCount FROM (OtherQuery) other LEFT OUTER JOIN
posts_read ON posts_read.of_thread = other.thread AND posts_read.user=5
现在,您可能希望向该查询添加
WHERE UnreadCount > 0
,以便仅获取包含未读帖子的帖子。你也想要一个ORDERBY,但添加它应该没有问题。
修改强> 修改查询,假设帖子标识符严格增加:
SELECT other.thread, (SELECT count(*) FROM posts WHERE
posts.Thread = subscribed_to.thread
AND posts.ID > COALESCE(posts_read.has_read_post,0)
AND Post.Deleted=0) AS UnreadCount
FROM subscribed_to LEFT OUTER JOIN
posts_read ON posts_read.of_thread = subscribed_to.thread AND
posts_read.user=subscribed_to.user
WHERE subscribed_to.user=5
此新查询通过计算帖子ID大于用户已阅读的最高帖子ID的帖子中的未删除帖子数来计算未读帖子。显然我对post表的命名以及它的结构方式做了一些猜测,但是调整它以匹配你的表中包含的帖子是不是很难。