我有页面,在创建或编辑页面时,可以将父页面分配给该页面。
现在我需要编写一个查询来返回可能的父级(因此是页面上的查询)。问题是我只能允许一层深度,这意味着用户无法选择父级,如果该父级
- 已有 child
- 还有一个 parent
- 可能导致嵌套关系!
最后一个是关键也是难点,我来解释一下:
+----+-----------+---------------+------------------------+
| id | parent_id | title | |
+----+-----------+---------------+------------------------+
| 1 | NULL | Mother | |
| 2 | NULL | Daughter | <----- selected record |
| 3 | 2 | Granddaughter | |
+----+-----------+---------------+------------------------+
I can't allow the 'Mother' to be in the collection of possible parents for the 'Daughter', since the 'Daughter' already has a Child, this would make the 'Granddaughter' a nested relation (remember, I can only allow one level).
到目前为止我做了什么
我已经只允许没有 child 、没有 parent 的记录
但是当我编辑“女儿”时,这仍然返回“母亲”记录,因为“母亲”没有 child 或 parent ,因此在这里是允许的,但是它不应该是这样,因为一旦我将“母亲”指定为“女儿”的 child ,我最终会得到一个嵌套关系!
基本上
我需要“如果另一行将所选记录的 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 页。然后选择除最后选择的行之外没有父行的所有行。所以你得到了所有可能的 parent / child 。
如果您有页面的 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)
您检查它是否有子级或是否有父级。
关于php - MySQL 查询防止嵌套树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57096283/