• 【Mysql】关联查询1对多处理


    关联查询1对多返回

    遇见的问题

    审批主表,和审批明细表,一张审批对应多张明细数据,每条明细数据的状态是不一样的,现在需要根据明细的状态获取到主单子的状态,状态返回矩阵如下

    明细状态返回总状态
    都是已完成已完成
    都是已终止已终止
    有进行中进行中
    有草稿草稿
    只有已完成和已终止已完成

    观察报错

    问题解决

    SELECT vba.object_id,
           vba.create_time,
           vba.company_id,
           vba.approval_no,
           vba.finish_time,
           vba.business_table,
           vba.business_id,
           t2.enum_status,
           vba.create_user_name,
           vba.apply_abstract
    FROM view_bus_approval vba
             LEFT JOIN view_bus_payment vbp ON vba.object_id = vbp.approval_id
             LEFT JOIN (SELECT ba.approval_id,
                               CASE
                                   WHEN ba.enum_status = '05'
                                       AND ba.cnt > 0 THEN
                                       '05'
                                   WHEN ba.enum_status = '10'
                                       AND ba.cnt > 0 THEN
                                       '10'
                                   WHEN ba.enum_status = '20'
                                       AND ba.cnt = ba1.cnt THEN
                                       '20'
                                   WHEN ba.enum_status = '30'
                                       AND ba.cnt = ba1.cnt THEN
                                       '30'
                                   WHEN ba.enum_status = '40'
                                       AND ba.cnt = ba1.cnt THEN
                                       '40'
                                   ELSE '20'
                                   END AS enum_status
                        FROM (SELECT t2.approval_id,
                                     t2.enum_status,
                                     sum(cnt) AS cnt
                              FROM view_approval_detail_status_cnt t2
                              WHERE t2.approval_user_id = 1
                              GROUP BY t2.approval_id,
                                       t2.enum_status) ba
                                 LEFT JOIN (SELECT t2.approval_id, sum(cnt) AS cnt
                                            FROM view_approval_detail_status_cnt t2
                                            WHERE t2.approval_user_id = 1
                                            GROUP BY t2.approval_id) ba1 ON ba1.approval_id = ba.approval_id
                        GROUP BY ba.approval_id) t2 ON t2.approval_id = vba.object_id
    WHERE vba.is_deleted = 0
      AND vba.business_table = 'bus_official_seal_use'
    ORDER BY (
                 CASE
                     vba.enum_status
                     WHEN '05' THEN
                         1
                     WHEN '30' THEN
                         2
                     WHEN '10' THEN
                         3
                     WHEN '40' THEN
                         4
                     WHEN '20' THEN
                         5
                     ELSE 6
                     END
                 ) ASC,
             vba.create_time DESC;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    这里用到了两层查询,一遍是查询该申请单子的所有明细的数量

    SELECT t2.approval_id, sum(cnt) AS cnt
    FROM view_approval_detail_status_cnt t2
    WHERE t2.approval_user_id = 1
    GROUP BY t2.approval_id
    
    • 1
    • 2
    • 3
    • 4

    然后外层是查询该单子下再按照状态进行分组求和

    SELECT t2.approval_id,
           t2.enum_status,
           sum(cnt) AS cnt
    FROM view_approval_detail_status_cnt t2
    WHERE t2.approval_user_id = 1
    GROUP BY t2.approval_id,
             t2.enum_status
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    然后拿到的申请单id,再group by这个单子id,因为一个单子只会返回一个状态,就达到效果了。

    结语

    如果哪位大佬发现了解释的不对的,还望不吝赐教。十分感谢

  • 相关阅读:
    手把手教大家搭建微信公众号查题
    内容安全复习 6 - 白帽子安全漏洞挖掘披露的法律风险
    Neo4j学习笔记(一) 安装配置
    直接用dataframe.plot()绘图时,修改数据为百分数
    使用valgrind查看xerces-c++内存使用情况
    高等数值计算方法学习笔记第7章【非线性方程组求根】
    蓝桥杯:后缀表达式
    硕士课程 可穿戴设备之作业一
    【WEEK9】 【DAY3】JSR303数据校验及多环境切换【中文版】
    IDEA中 GIT基础操作
  • 原文地址:https://blog.csdn.net/timewaitfornoone/article/details/132606591