【问题标题】:MySQL Query to prevent nested treeMySQL 查询以防止嵌套树
【发布时间】:2019-07-18 13:58:19
【问题描述】:

我有页面,在创建或编辑页面时,可以为该页面分配父级。

现在我需要编写一个返回可能的父母的查询(因此在页面上进行查询)。问题是我只能允许一个级别的深度,这意味着如果父级用户不能选择父级

  • 已经有了孩子
  • 还有父母
  • 可能导致嵌套关系!

最后一个是关键难点,我来解释一下:

+----+-----------+---------------+------------------------+
| id | parent_id |     title     |                        |
+----+-----------+---------------+------------------------+
|  1 | NULL      | Mother        |                        |
|  2 | NULL      | Daughter      | <----- selected record |
|  3 | 2         | Granddaughter |                        |
+----+-----------+---------------+------------------------+

我不能让“母亲”出现在“女儿”的可能父母的集合中,因为“女儿”已经有一个孩子,这会使“孙女”成为嵌套关系(记住,我只能允许一级)。

到目前为止我做了什么

我已经只允许没有孩子没有父母

的记录

但是当我编辑“女儿”时,这仍然会返回“母亲”记录,因为“母亲”没有孩子或父母,因此在这里是允许的,但是不应该,因为一旦我将“母亲”作为孩子分配给“女儿”,我最终会得到一个嵌套关系!

基本上

我需要“如果另一行将所选记录的 id 作为父行,则返回空结果”

【问题讨论】:

  • 解决方案很简单,根据您的描述,您根本无法为Daughter 选择父级因为它有一个子级(每个父级选择都会创建一个嵌套关系出于这个原因).. 如果另一行将您的 id 作为父级,您只需要返回一个空结果
  • 是的!就是这样,但我不确定如何从mysql返回空?在查询期间?

标签: php mysql database laravel


【解决方案1】:

编辑:我误解了这个问题。你想要一层深度,所以:

您需要知道 id 不等于其他行的 id_parent 的行(无子页面)以及 id_parent 为空的行(无父页面)。

SELECT * FROM pages WHERE id NOT IN (SELECT id_parent FROM pages WHERE id_parent IS NOT NULL) AND id_parent IS NULL

子查询返回所有具有有效 id_parent 的 ID 页面。然后,您选择所有没有父行的行,最后选择的除外。所以你得到了所有可能的父母/孩子。

如果您有页面的 id 并且想知道它是否有子级或父级(所以如果它有效),您可以通过 2 个查询来完成:

1) 检查是否有父节点:

SELECT id_parent FROM pages WHERE id = YOUR_PAGE_ID

2) 如果结果为 'null',则页面没有父页面,所以让我们检查它是否有子页面:

SELECT COUNT(*) FROM pages WHERE id_parent = YOUR_PAGE_ID

如果结果为 0,则页面没有子页面,因此它是有效页面。

使用单个查询:

SELECT COUNT(*) FROM pages WHERE id_parent = YOUR_PAGE_ID OR (id = YOUR_PAGE_ID AND id_parent IS NOT NULL)

您检查它是否有孩子或是否有父母。

【讨论】:

  • 这是两种可能的解决方案。第一个包含一个子查询(但它实际上是一个单独的查询)并为您提供所有可能的父项。第二个告诉您特定页面有多少个孩子;如果它们为 0,则该页面可能是父页面。首先,您可以向用户显示他可以选择哪些父母;第二个您可以验证是否可以将特定页面用作父页面。
  • 当我测试你的第一个查询时,我仍然可以选择“母亲”,当我在“孩子”页面时。我需要结合第一个和第二个解决方案来完成这项工作?
  • 你认为这可以存在于一个查询中吗?还是那不可能?
  • 是的。使用第一个解决方案,只需执行第一个查询。如果结果中有你想要关联的 2 个页面,你可以允许它,如果没有,避免它。如果您想采用第二种解决方案但只有一个查询...我刚刚编辑了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多