你好,
我的数据库表结构如下。
TableName:- UserTable
id | empName | reportsTo
-----------------------
1 | XYZ | -
2 | ABC | 1
3 | MNP | 2
4 | IJK | 3
5 | PQR | 4
6 | DEF | 3
7 | STU | 2
如何获取他在顶层层次结构中报告的用户的详细信息。
例如。当我选择 id 为 7
的用户时,输出应为
id empName reportsTo
2 ABC 1
1 XYZ -
同样,当我选择 id 为 6
的用户时,它应该返回 id 的 3,2,1
的数据。
最佳答案
我认为您不理解我发布的可能重复的链接,因此这里是发布的解决方案,并进行了一些细微的调整以适应您的数据。
drop table if exists usertable;
create table usertable(id int, empName varchar(3), reportsTo int);
insert into usertable values
(1 , 'XYZ' , null),
(2 , 'ABC' , 1),
(3 , 'MNP' , 2),
(4 , 'IJK' , 3),
(5 , 'PQR' , 4),
(6 , 'DEF' , 3),
(7 , 'STU' , 2);
SELECT T2.id, T2.empname,t2.reportsto
FROM (
SELECT
@r AS _id,
(SELECT @r := reportsto FROM usertable WHERE id = _id) AS parent_id,
@l := @l + 1 AS lvl
FROM
(SELECT @r := 7, @l := 0) vars,
usertable h
WHERE @r <> 0) T1
JOIN usertable T2
ON T1._id = T2.id
where t2.id <> 7
ORDER BY T1.lvl;
+------+---------+-----------+
| id | empname | reportsto |
+------+---------+-----------+
| 2 | ABC | 1 |
| 1 | XYZ | NULL |
+------+---------+-----------+
2 rows in set (0.03 sec)
对于 id 6
SELECT T2.id, T2.empname,t2.reportsto
FROM (
SELECT
@r AS _id,
(SELECT @r := reportsto FROM usertable WHERE id = _id) AS parent_id,
@l := @l + 1 AS lvl
FROM
(SELECT @r := 6, @l := 0) vars,
usertable h
WHERE @r <> 0) T1
JOIN usertable T2
ON T1._id = T2.id
where t2.id <> 6
ORDER BY T1.lvl;
+------+---------+-----------+
| id | empname | reportsto |
+------+---------+-----------+
| 3 | MNP | 2 |
| 2 | ABC | 1 |
| 1 | XYZ | NULL |
+------+---------+-----------+
3 rows in set (0.00 sec)
注意,我已将 id 1 的 reports 从 - 更改为 null。仅当报告小于 id 时,此功能才有效,否则您将必须认真考虑您的数据结构。
关于mysql - 如何使用mysql获取用户的顶层分层数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51466384/