如何使用mysql获取用户的顶级层次数据?
你好 我的数据库表结构如下如何使用mysql获取用户的顶级层次数据?,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,你好 我的数据库表结构如下 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的用户时,输出应该是
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的数据。有一个临时解决方案,但不适合继续使用它。你必须放下你的桌子,创建一个新的有组织的桌子 首先统计不同的报告值 你会得到一个号码。假设你得到5,那么有5个是一些员工的老板
SELECT * FROM test WHERE
id=(SELECT @boss := reportsto FROM test WHERE id=7)
OR
id=(SELECT @boss1 := reportsto FROM test WHERE id=@boss)
OR
id=(SELECT @boss := reportsto FROM test WHERE id=@boss1)
OR
id=(SELECT @boss1 := reportsto FROM test WHERE id=@boss)
OR
id=(SELECT @boss := reportsto FROM test WHERE id=@boss1)
如果你得到10,那么查询将是
SELECT * FROM test WHERE
id=(SELECT @boss := reportsto FROM test WHERE id=7)
OR
id=(SELECT @boss1 := reportsto FROM test WHERE id=@boss)
OR
id=(SELECT @boss := reportsto FROM test WHERE id=@boss1)
OR
id=(SELECT @boss1 := reportsto FROM test WHERE id=@boss)
OR
id=(SELECT @boss := reportsto FROM test WHERE id=@boss1)
OR
id=(SELECT @boss1 := reportsto FROM test WHERE id=@boss)
OR
id=(SELECT @boss := reportsto FROM test WHERE id=@boss1)
OR
id=(SELECT @boss1 := reportsto FROM test WHERE id=@boss)
OR
id=(SELECT @boss := reportsto FROM test WHERE id=@boss1)
OR
id=(SELECT @boss1 := reportsto FROM test WHERE id=@boss)
诸如此类我认为您不理解我发布的可能重复的链接,因此这里是发布在那里的解决方案,其中包含一些细微的调整,以适合您的数据
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)
身份证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的报告从-更改为null。只有当reports to小于id时,此选项才有效。否则,您必须认真考虑您的数据结构。选择user 7时,为什么要从id 1和id 2获取数据?它基于什么?什么是reporsto?这是他必须报告的用户的id吗?你使用的是什么版本的mysql?或者id为7的用户上的2@reportsTo说他必须为数据库中的前两个人报告吗?reportsTo意味着我们可以说是该用户的经理或老板。但这听起来不是很聪明,因为对于这个解决方案,数据库必须正确排序?如果新老板来了,他的身份证是25号怎么办?如果你将报告改为25,那么1-25之间的所有人都将是他的老板。同样,我不确定,但我认为这不会起作用,因为如果一个老板以后在数据库中得到安全保护,他也可以拥有更高的ID。你对老板的意思是什么?他在评论中说,报告的意思是,这是他的老板。。然后他的老板可能也有一个老板,那也是他的老板。。
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)