php - MySQL 查询防止嵌套树

标签 php mysql database laravel

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

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

  • 已有 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/

相关文章:

php - 如何在提交表单后保留先前上传的图像而不选择要在codeigniter中上传的新图像

php - 从 php 调用的 python 脚本连接到数据库

c# - MYSQL 命令可以上传到数据库的最大查询是多少?

php - MYSQL语法错误1064

database - 双向不同的多对多关系

database - 分布式事务-为什么我们将记录保存到文件系统?

php - 下一条记录不存在错误处理

php - 使用 PHP 从基于 Linux 的文件服务器上传/检索文件

php - 将数据库中已有的点与正在发送的点相加

mysql - 显示数据库表名称及其列号