同一路径内的最短字符串(分支)

ver*_*tas 5 php mysql sql

我有一个基于MySQL的表中的树表示id,depth,parent_idpath.此表中的每个记录都具有深度0,parent_id != null并且path基于左侧填充的ID的十六进制值表示0.

树的每个元素都是通过指定,(伪代码)构造的depth = parent.depth + 1,例如:path = parent.path + hex(id)parent_id = parent.id

id    path            depth    parent_id    assigned_user_id
------------------------------------------------------------
1     001             0        NULL         NULL
2     002             0        NULL         1
3     001003          1        1            2
4     002004          1        2            1
5     001003005       2        3            2
6     001003005006    3        5            2
7     002004007       2        4            1
8     002004008       2        4            2
9     002004009       2        4            2
10    00200400800A    3        8            2
Run Code Online (Sandbox Code Playgroud)

等等...问题是如何将特定用户ID的记录限制在同一分支中的最短路径.例如,对于assigned_user_id = 2retrive:

id    path            depth    parent_id    assigned_user_id
------------------------------------------------------------
3     001003          1        1            2
8     002004008       2        4            2
9     002004009       2        4            2
Run Code Online (Sandbox Code Playgroud)

代替:

id    path            depth    parent_id    assigned_user_id
------------------------------------------------------------
3     001003          1        1            2
5     001003005       2        3            2
6     001003005006    3        5            2
8     002004008       2        4            2
9     002004009       2        4            2
10    00200400800A    3        8            2
Run Code Online (Sandbox Code Playgroud)

And*_*y M 2

SELECT t1.*
FROM atable t1
  LEFT JOIN atable t2
    ON t2.assigned_user_id = t1.assigned_user_id AND
       t2.path = LEFT(t1.path, CHAR_LENGTH(t2.path)) AND
       t2.id <> t1.id
WHERE t1.assigned_user_id = 2
  AND t2.id IS NULL
Run Code Online (Sandbox Code Playgroud)