MYSQL-从父母那里得到所有孩子

时间:2018-08-14 13:23:24

标签: php mysql mysqli parent-child hierarchy

我一直在获取所有父级ID大于客户ID的子查询

表测试

  id    name    parent
    1   test1   0
    2   test2   1
    3   test3   1
    4   test4   2
    5   test5   2
    6   test6   10
    7   test7   10
    8   test8   6
    9   test9   6
    10  test10  5
    11  test10  7

当前我正在使用此递归查询,但它显示直到10个父级的子级,但不能给出6个,7个及以后的子级

SELECT id , parent FROM (SELECT  id , parent from (SELECT * FROM test order by
parent , id) testdata_sorted, (SELECT @pv := '1') initialisation where 
find_in_set(parent , @pv) > 0 and @pv := concat(@pv, ',', id)  ORDER BY 
parent ASC) AS tt

当前输出为->

id  parent
2   1
3   1
4   2
5   2
10  5
6   10
7   10

我需要这种类型的输出。在这方面,我需要帮助。

id  parent
2   1
3   1
4   2
5   2
10  5
6   10
7   10
8   6
9   6
11  7

2 个答案:

答案 0 :(得分:0)

您正在使用一种脆弱的方式来模拟递归查询。它特别要求父行必须在子行之前排序

您的基本行集正在使用order by parent, id

id  parent
----------------------
1   0
2   1         -- fine
3   1         -- fine 
4   2         -- fine
5   2         -- fine 
10  5         -- fine 
8   6         -- parent 6 comes later!
9   6         -- parent 6 comes later! 
11  7         -- parent 7 comes later!
6   10        -- fine
7   10        -- fine

您看到这些正是您的结果中缺少的行。

对此没有简单的解决方法,因为要在运行中对行进行排序以便能够在递归查询中使用,您需要一个递归查询。不过,您也许可以通过满足该条件的方式输入数据。虽然我假设问题中的父代号大于客户代号的部分 实际上不是条件(因为您的预期输出与此不符):如果您有这种限制父母和孩子的条件,可能会给您可能的命令。

有关建模数据或编写查询的其他方法,请参见How to create a MySQL hierarchical recursive query。实际上,trincots answer包含有关代码订购要求的说明。

最好使用支持递归CTE的版本,因为只要您不想更改数据模型,针对这些问题的每种解决方法都有一定的局限性(例如,行顺序或最大深度)。

一个旁注:MySQL可以忽略子查询中的order by(特别是testdata_sorted),您可能必须验证它是否不正确(这可能取决于版本,索引等或表格大小)。

答案 1 :(得分:0)

谢谢大家的答复,但是从当前情况来看,我分析由于版本问题,MY SQL无法解决此问题,因为最终此递归查询在某个时候中断了。

因此,我必须使用相同的查询在PHP中创建一个递归函数,该查询在Child id大于parent的位置处中断,并使用break ID一次又一次调用相同的函数,并在同一数组中添加数据。这给出了我想要的结果。

Serial.readBytes(buff, receveidBuffLen);