如何使用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)