【问题标题】:MySQL Relational Query -- is JOIN the answer?MySQL 关系查询——JOIN 是答案吗?
【发布时间】: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


【解决方案1】:
Select parent, group_concat(title) from posts where 
parent!='' group by parent;

从这里开始,看看会发生什么。

【讨论】:

  • 感谢您的帮助。我仍在研究这个,并将继续这样做,但最初的尝试没有返回任何结果。
  • 如果您的表名和列名正确,则该查询应返回结果。
  • 你是绝对正确的。不知道我以前的错字在哪里,但我现在肯定得到了结果。我必须深入研究这一点,看看如何将我的查询限制在列表的一个子集中,并返回没有孩子的父母。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 2018-11-15
  • 2021-07-18
  • 1970-01-01
相关资源
最近更新 更多