Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在SQL中检查子级的所有父记录的列值_Mysql_Sql_Parent_Hierarchical Data - Fatal编程技术网

Mysql 如何在SQL中检查子级的所有父记录的列值

Mysql 如何在SQL中检查子级的所有父记录的列值,mysql,sql,parent,hierarchical-data,Mysql,Sql,Parent,Hierarchical Data,假设我们有一个包含3列的表:ID、PARENT\u ID和VALUE 例如,我们有8条记录: ID PARENT_ID VALUE A NULL 1 B A 1 C B 0 D C 1 E D 1 F E 1 G F 1 H G 0 我们如何使用SQL查询或存储过程(最好是MySQL)检查ID为“G”的记录的任何父记录的值是否为0?如果链中的父项的值为

假设我们有一个包含3列的表:IDPARENT\u IDVALUE

例如,我们有8条记录:

ID PARENT_ID VALUE
A  NULL      1
B  A         1
C  B         0
D  C         1
E  D         1
F  E         1
G  F         1
H  G         0   
我们如何使用SQL查询或存储过程(最好是MySQL)检查ID为“G”的记录的任何父记录的值是否为0?如果链中的父项的值为0,则无需进一步向后检查

这必须通过获取任何子ID,并在该子ID之前查看其父ID的整个链。某些子项可能没有父项,也可能有父项链,并且父项记录可以有0个或多个子项记录


在本例中,搜索将在ID为“C”的记录处结束(即:返回该ID很好),因为它是父链(例如G)的父记录,其值为0。

以下是MySQL 8.0递归CTE查询的一个示例,它执行您所描述的操作,遍历“G”的祖先并返回值为0的父记录:

with recursive cte as (
  select * from mytable where id = 'G'
  union all
  select t.* from cte join mytable t on t.id = cte.parent_id
) select * from cte where value = 0;

+------+-----------+-------+
| id   | parent_id | value |
+------+-----------+-------+
| C    | B         |     0 |
+------+-----------+-------+

阅读有关递归CTE查询的更多信息。

同时指定预期结果。MySQL的哪个版本?如果你想要整个父链,你需要一个递归的CTE,它只在8.x中可用。当然,我有最新版本的MySQL。让我看看这个链接。mikehillyer解决方案不是MySQL 8递归CTE解决方案,它是为那些还没有MySQL 8的人提供的。