【问题标题】:Fetching hierarchical data in mysql [duplicate]在mysql中获取分层数据[重复]
【发布时间】:2021-12-29 04:43:45
【问题描述】:

我有一个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

【问题讨论】:

  • 什么是精确 MySQL版本?
  • @Akina 我检查的版本是 8.0.22
  • 并且创建函数没问题?
  • @AliFidanli 查询更好,因为我们可以使用它的代码来获取数据

标签: mysql


【解决方案1】:

我检查的版本是 8.0.22 – Yogus

WITH RECURSIVE
cte AS ( SELECT *
         FROM user
         WHERE IMMEDIATE_SUPERIOR_ID = 432
       UNION ALL
         SELECT user.*
         FROM user 
         JOIN cte ON cte.user_id = user.IMMEDIATE_SUPERIOR_ID )
SELECT cte.user_id, 432 IMMEDIATE_SUPERIOR_ID 
FROM cte;

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=3acc566a4a7f356c0c48764be600c69a


如果您需要为多个 root 用户收集数据,那么

WITH RECURSIVE
cte AS ( SELECT *, user_id UPPER_SUPERIOR_ID
         FROM user
         WHERE IMMEDIATE_SUPERIOR_ID IS NULL
         --  AND user_id IN ( {needed root users list} )
       UNION ALL
         SELECT user.user_id, user.IMMEDIATE_SUPERIOR_ID, cte.UPPER_SUPERIOR_ID
         FROM user 
         JOIN cte ON cte.user_id = user.IMMEDIATE_SUPERIOR_ID )
SELECT cte.user_id, UPPER_SUPERIOR_ID 
FROM cte
-- WHERE IMMEDIATE_SUPERIOR_ID IS NOT NULL
-- ORDER BY UPPER_SUPERIOR_ID, user_id
;

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=de8997ad5d484eec9d6c7a8c1844f1c5

【讨论】:

  • 如您所知,对于像这样的分层查询,有一个很好的规范答案。
猜你喜欢
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
相关资源
最近更新 更多