mysql - 如何使用mysql获取用户的顶层分层数据?

标签 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 的用户时,输出应为

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/

相关文章:

php - php 中的排名/编号

sql - TSQL 如何在解析行时遍历行?

MySQL 更新同一个表上的 TRIGGER

sql - 具有实时 PL/SQL 输出

mysql - SQL 计数多列?

android - SQLite 查询未按特定顺序执行

sql-server - SQL Server SELECT INTO 和临时表阻塞

MySQL存储过程语法错误

mysql - InnoDB - IBD 文件不断增长,占用了服务器上的所有空间

MYSQL如果参数为空则设置