【问题标题】:MySQL return list of each parent and its childrenMySQL 每个父母及其子女的返回列表
【发布时间】:2018-05-16 22:04:48
【问题描述】:

我有一张如下表:

Manager 是父级,其下的子资源与经理的父级 ID 相连。

id    | parent_id   |   Role       | Number of roles

123   | 123         | Manager      |    2

124   | 123         | Resource     |    1

125   | 123         | Resource     |    2

128   | 128         | Manager      |    1

126   | 128         | Resource     |    4

127   | 128         | Resource     |    3

我的 sql 查询应该为每个父级返回以下结果:

id    | parent_id   |   Role       | Sum of manager only | Total resources

123   | 123         | Manager      |    2                |    2+1+2 = 5 (Manager + the total number of resources for parent id 123)   

128   | 128         | Manager      |    1                |    1+4+3 = 8 (Manager + the total number of resources for parent id 128)   

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 子查询应该是最后一个选项,因为它会降低您的系统速度。

标签: mysql sql plsql mysql-workbench recursive-query


【解决方案1】:

我希望这样做:

SELECT 
    m1.*, m2.sum_roles
FROM
    managers_workers m1
        LEFT JOIN
    (SELECT 
        parent_id, SUM(num_of_roles) AS sum_roles
    FROM
        managers_workers
    GROUP BY parent_id) AS m2 ON m1.id = m2.parent_id
WHERE
    m2.parent_id IS NOT NULL
;

【讨论】:

    【解决方案2】:

    您只需要使用父 ID 进行自我加入。如果你的表名是“tbl_manager”

    SELECT t1.id,
        SUM(IF(t1.id = t2.id, 1,0)) AS is_manager,
        t1.parent_id, 
        t1.Role, 
        t1.Number_of_Role AS Sum_of_manager_only,
        IFNULL(SUM(t2.Number_of_Role),0) AS Total_resources 
    FROM  tbl_manager AS t1 
    LEFT JOIN  tbl_manager AS t2 
        ON t2.parent_id = t1.id 
    GROUP BY t1.id
    HAVING is_manager;
    

    【讨论】:

      【解决方案3】:

      你可以使用子查询

      select
          (select id from mytbl where id=r.parent_id)  id
          ,r.parent_id
          ,(select sum(NofRole) from mytbl where parent_id=r.parent_id and Role='Manager') [Sum of manager only]
          , sum(r.nofrole) [Total resources]
          from mytbl r
          group by r.parent_id
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-02
        • 1970-01-01
        • 1970-01-01
        • 2020-07-25
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多