我在 mysql 表中有一个基于 id
、depth
、parent_id
和 path
的树表示。此表中的每个 root 记录的深度为 0
,parent_id != null
和基于十六进制的 path
表示用 0
向左填充的 ID 值。
树的每个元素都是通过指定 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
等等...
问题是如何将特定用户 ID 的记录限制在同一分支 的最短路径内。例如对于 assigned_user_id = 2
检索:
id path depth parent_id assigned_user_id
------------------------------------------------------------
3 001003 1 1 2
8 002004008 2 4 2
9 002004009 2 4 2
代替:
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
最佳答案
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
关于php - 同一路径(分支)内的最短字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6162527/