应该如何进行多表连接?

时间:2011-02-28 05:11:42

标签: mysql join

我有一个有线程,帖子和用户的讨论区。

  • 用户表
  • 线程表
  • 属于帖子的帖子表
  • 用户想要阅读的线程的查找表
  • 一个查找表,列出给定用户在给定线程中读取的最高编号的帖子。

所以现在我需要创建一个连接,这样,对于给定的用户,我可以获得一个未读帖子的线程表。

如何创建正确的联接?用户,帖子和帖子当然都有一个主键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个帖子。

我可以一步完成吗?当然,她可能会订阅多个线程,因此我们应该按哪个线程排序最多。

1 个答案:

答案 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表的命名以及它的结构方式做了一些猜测,但是调整它以匹配你的表中包含的帖子是不是很难。