[英]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.