【发布时间】:2018-12-06 17:43:35
【问题描述】:
我正在使用 MySQL 为我的网站编写一个基本的论坛系统。我需要一种方法不仅可以跟踪帖子,还需要对帖子的回复TO。由于每个帖子只能有 ONE 父母,但最终可以有 MULTIPLE 孩子,我想我需要两张桌子。第一个表至少包含每个帖子的标题、正文和父级。第二个表仅包含对 PARENT 帖子及其对应的 CHILDREN 的引用,如下所示:
Posts Table
ID | PARENT | TITLE | POST
1 | | Msg 1 | Body 1
2 | | Msg 2 | Body 2
3 | | Msg 3 | Body 3
4 | 2 | Msg 4 | Body 4
5 | 1 | Msg 5 | Body 5
6 | | Msg 6 | Body 6
7 | | Msg 7 | Body 7
8 | 5 | Msg 8 | Body 8
9 | | Msg 9 | Body 9
10 | 1 | Msg 10 | Body 10
11 | 1 | Msg 11 | Body 11
12 | 2 | Msg 12 | Body 12
Children Table
ID | PARENT | CHILDREN
1 | 2 | 4
2 | 1 | 5
3 | 5 | 8
4 | 1 | 10
5 | 1 | 11
6 | 2 | 12
在此示例中,消息 1 有 3 个孩子:5、10 和 11。消息 2 有 2 个孩子:4 和 12。等等。
有了这些信息,我正试图找到最好的方法来确定我的帖子列表(比如消息 5 到 10)的 子集 的子级?某种 JOIN 是否允许单个查询获取父级和任何相应的子级?还是我最好对每条父消息进行单独查询以确定其子消息?
我正在努力理解 JOIN,这真是令人困惑。对不起,如果这是基本的东西,但提前谢谢。
【问题讨论】:
-
两个表都不需要。第一个表中的父信息与第二个表相同。
-
要让父母和他们的孩子,您需要
UNION。一个子查询只是获取父母,另一个是JOIN获取他们的孩子。 -
@Barmar 我意识到如果我查询整个表,我将能够构成所有依赖项。但是,如果您限制您的查询,您可以拥有远远早于查询范围的父帖子。此外,这些父母可能有许多其他孩子,也在查询范围之前(或之后)。那是我的问题。我会阅读UNION。还将阅读 SELF-JOIN。这在这个解决方案中有什么应用吗?提前致谢。
-
如果您只使用
Posts表而不使用Children表,您将使用自联接。 -
谢谢@Barmar。根据您的指导,我现在的研究重点是
SELF-JOIN。但老实说,这伤害了我的大脑。如果您对如何构建这样的查询有任何温和的指导,鉴于我提供的示例表,我将永远欠您的债。如果没有,我敢肯定我会在未来 6 个月内的某个时候解决这个问题。 :)
标签: mysql join foreign-keys self-join