我一直在获取所有父级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
答案 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);