繁体   English   中英

MySQL查询防止嵌套树

[英]MySQL Query to prevent nested tree

我有Pages,在创建或编辑页面时,可以为该Page分配一个父对象。

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

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

最后一个是关键而困难的,让我尝试解释一下:

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

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

到目前为止我做了什么

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

但是,当我编辑“ Daughter”时此stil返回“ Mother”记录 ,因为“ Mother”没有孩子或父母,因此在这里允许,但不应这样做,因为一旦我分配作为“女儿”的孩子的“母亲”,我最终陷入了嵌套关系!

基本上

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

编辑:我误解了这个问题。 您需要一个深度级别,因此:

您需要知道id不等于其他行的id_parent的行(无子页面)和id_parent为null(无父项的页面)的行。

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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM