Mysql 这种多表联接应该如何进行?

Mysql 这种多表联接应该如何进行?,mysql,join,Mysql,Join,我有一个带有线程、帖子和用户的讨论板 用户表 线程表 属于线程的帖子表 用户希望读取的线程的查找表 列出给定用户在给定线程中读取的编号最高的帖子的查找表 所以现在我需要创建一个连接,这样,对于给定的用户,我可以得到一个包含未读帖子的线程表 如何创建正确的联接?当然,用户、帖子和线程都有一个主键ID,记录在查找表中,即 TABLE `posts_read` user | has_read_post | of_thread --------------------------------- 5

我有一个带有线程、帖子和用户的讨论板

  • 用户表
  • 线程表
  • 属于线程的帖子表
  • 用户希望读取的线程的查找表
  • 列出给定用户在给定线程中读取的编号最高的帖子的查找表
所以现在我需要创建一个连接,这样,对于给定的用户,我可以得到一个包含未读帖子的线程表

如何创建正确的联接?当然,用户、帖子和线程都有一个主键ID,记录在查找表中,即

TABLE `posts_read`
user  | has_read_post | of_thread
---------------------------------
5     | 100           | 3

示例:用户5订阅了线程3,并且已经阅读了线程3的100篇文章,但是线程3现在有200篇文章,用户希望在帖子101开始阅读线程3,因为她落后了100篇文章


我能一步完成吗?当然,她可能订阅了多个线程,因此我们应该按哪个线程的未读次数最多进行排序。

下面是解决此问题的可能方法。我假设posts_read.has_read_post等于读取的posts数量,而不是在所有线程中唯一标识post的数字。如果它是唯一的帖子标识符,那么事情就更难了

首先创建一个返回两列的查询。列是用户订阅的每个线程的线程号。第二列是该线程中的帖子数

这应该是一个相当容易设计的查询。我假设查询返回名为“thread”和“posts”的列

现在,我们基于该查询创建一个新查询,该查询包含每个此类线程的未读消息。我假设我们对5号用户感兴趣。您将需要用已编写的查询替换OtherQuery(但保留括号)

现在您可能需要添加一个

WHERE UnreadCount > 0

此新查询通过计算帖子id大于用户已读取的最高帖子id的线程中未删除帖子的数量来计算未读帖子的数量。显然,我对posts表的名称和结构进行了一些猜测,但调整它以匹配表中包含的posts外观应该不难。

请发布您迄今为止编写的代码。人们通常不喜欢只为您编写代码。事实上,这是一个工作描述,不是一个问题。到目前为止,我编写的代码是“SELECT”,然后我绞尽脑汁想下一步该怎么做。这还不够,你必须以前编写过sql查询。不要试图解决你头脑中的问题,开始写下解决方案。嗨,非常感谢!那里有很多值得思考的地方。老实说,我从来没有听说过“联合”(无论如何在MySQL中)!但这是一个唯一的帖子id,不是帖子的数量,因为帖子可以被删除,所以稍后会取消计数。无论如何,这让我有很多话要说,再次感谢。@AmbroseChapel:我已经根据您所说的以及一些关于您的post表的猜测对查询进行了重大修改。如果您在执行此操作时遇到困难,请告诉我,我很乐意提供帮助。
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
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