在MySQL中获取分层数据

17 浏览
0 Comments

在MySQL中获取分层数据

我有一个user表,

USER_ID  IMMEDIATE_SUPERIOR_ID
432      NULL
554      432
1150     432
1442     1150

为了获取层级数据,我编写了以下查询:

SELECT c1.user_id as level_1, c2.user_id as level_2, 
c3.user_id as level_3, c4.user_id as level_4 ,
c4.user_id as level_5 , c4.user_id as level_6 
FROM `user` as c1
    LEFT JOIN `user` as c2 ON c1.user_id =c2.IMMEDIATE_SUPERIOR_ID 
    LEFT JOIN `user` as c3 ON c2.user_id =c3.IMMEDIATE_SUPERIOR_ID 
    LEFT JOIN `user` as c4 ON c3.user_id =c4.IMMEDIATE_SUPERIOR_ID
    LEFT JOIN `user` as c5 ON c4.user_id =c5.IMMEDIATE_SUPERIOR_ID 
    LEFT JOIN `user` as c6 ON c5.user_id =c6.IMMEDIATE_SUPERIOR_ID 
    where  c1.USER_ID =432

结果:

level_1|level_2|level_3|level_4|level_5|level_6|
-------+-------+-------+-------+-------+-------+
    432|    554|       |       |       |       |
    432|   1150|   1442|       |       |       |

我该如何显示以下输出,因为用户432是这三个用户的最高经理?

    USER_ID  IMMEDIATE_SUPERIOR_ID 
    554      432
    1150     432
    1442     432

0
0 Comments

MySQL数据库中的层级数据检索问题出现的原因是需要查询具有层级结构的数据。解决方法是使用递归查询(RECURSIVE)来获取层级数据。

第一个代码示例使用了递归查询来获取给定上级用户ID为432的所有用户。首先,从user表中选择上级用户ID为432的用户作为初始记录,然后通过联接查询将符合条件的用户与cte(递归查询结果集)进行联接,直到获取到所有符合条件的用户信息。最后,从递归查询结果集中选择用户ID和上级用户ID为432的记录。

第二个代码示例在第一个示例的基础上进行了扩展,可以获取多个根用户的数据。首先,从user表中选择上级用户ID为空的用户作为初始记录,然后通过联接查询将符合条件的用户与cte进行联接,直到获取到所有符合条件的用户信息。最后,从递归查询结果集中选择用户ID和上级用户ID。

这两个代码示例都可以在提供的链接中进行测试和验证。

对于类似这样的层级查询问题,有一个很好的经典答案,如你所了解的。

0