最近在面试看到一个很有趣的问题, 想征集一下大家有什么更好的思路来实现。。
有两张数据表: depts, users
其中第一张:
id | parent_id | type_id | dept_name |
---|---|---|---|
1 | 0 | 1 | TG |
2 | 0 | 1 | SG |
3 | 1 | 2 | 设计部 |
4 | 1 | 2 | 研发部 |
5 | 2 | 1 | 产品部 |
6 | 1 | 5 | 运维安全线 |
7 | 6 | 2 | 安全平台部 |
8 | 6 | 2 | 网络平台部 |
第二张:
id | dept_id | user_name |
---|---|---|
1 | 3 | 小明 |
2 | 3 | 小红 |
3 | 3 | 小张 |
4 | 4 | 小王 |
5 | 4 | 老张 |
6 | 4 | 小黑 |
7 | 5 | 大黄 |
8 | 7 | 大虾 |
9 | 7 | 零七 |
10 | 8 | 天空 |
11 | 8 | 玛丽 |
要求找出 表中 TG的所有员工。
我想到的最便捷的方式是。。添加字段。。path.
(例如 安全平台部 path:0-1-6-7), 但是原题是上不允许这样的做的, 如果要Join 表的话,可能需要递归操作。。。所以想让大家看看有什么好的思路。。
以前做过类似的查询,是关于商品分类的,不过当时用的是MySQL自定义函数里面写的递归,实现比较简单。这里如果只用一句SQL查询,只能利用SQL变量做文章了。大致说下实现思路:
按parent_id从小到大遍历depts所有记录,不断拼接@all_path变量,遍历完之后,取最后一条记录
,3,4,7,8,6,1,:,5,2,
很显然,上面每个根节点为0的都是分号分隔了,根据TG的id=1再次做一个字符串处理,得到1,3,4,7,8,6
最后联合users表查询即可