SELECT xxx FROM USER_ORG,USER,ORG WHERE USER_ORG.USER_ID=USER.USER_ID AND USER_ORG.ORG_ID = ORG.ORG_ID AND USER.NAME=姓名 AND ORG.PATH LIKE 你所要查询的根部门的路径,例如查询技术部,是 '/ROOT/TECH%'
UPDATE ORG
SET PATH=CONCAT(
IFNULL(
(SELECT PATH FROM ORG WHERE ORG_ID=当前编辑记录的PARENT_ID),
''
),
'/',
当前编辑记录的ORG_ID
)
WHERE ORG_ID = 当前编辑记录的ORG_ID
CONCAT是字符串连接操作函数。
这样就会形成
/0
/0/1
/0/2
/0/1/3
/0/1/4
这样的PATH了
这样的结构非常适合避免“树型”结构中、对某一节点的子节点进行遍历并执行操作的需求。
但是回看lz的需求,好像是基于内存操作的,这个部门树(tree结构)假如是在内存中,用户与部门的关联关系(一个set结构)也在内存中。那么就完全没必要用sql了,可以使用算法遍历得到一个部门数组,然后以此再筛选出符合姓名条件的用户数组(set结构必须保存有姓名数据,否则无法执行)。
最后在执行对用户的操作时(例如使用二维表格列出这些用户的信息,不明白是不是这样的意思),才使用sql查询,利用IN语句(IN语句最好是IN记录的主键,例如USER_ID,这样才能最大限度利用索引。如果使用的是USER_NAME,在USER_NAME上做索引的话也能达到较高效率,但是字符串匹配速度比数值匹配慢好几倍) ,不知道多爽。
SELECT * FROM USER WHERE USER_ID IN ( 目标用户id )