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

关联查询1对多返回

遇见的问题

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

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

观察报错

问题解决

sql 复制代码
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;

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

sql 复制代码
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

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

sql 复制代码
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

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

结语

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

相关推荐
‎ദ്ദിᵔ.˛.ᵔ₎5 小时前
MySQL 表约束
数据库·mysql
linmengmeng_13147 小时前
【总结】MyBatis-Plus批量插入与清表的正确姿势
java·spring boot·mysql·mybatis
达梦数据9 小时前
DMDRS空间数据类型说明:Oracle、DM8、MySQL空间数据类型映射
数据库·mysql·oracle
lusklusklusk10 小时前
Oracle索引组织表,SQLServer聚集索引,Mysql Innodb表的数据行不是在磁盘上像排队一样严格连续地存放
mysql·postgresql·oracle·sqlserver
螺蛳粉 螺蛳粉12 小时前
mysql的备份与恢复
linux·运维·数据库·mysql
计算机毕设定制辅导-无忧学长13 小时前
《基于SpringBoot的中学教师数字胜任力测评网站的设计与实现》
java·vue.js·spring boot·mysql·中学教师数字胜任力测评网站
guo_wen_qiang13 小时前
mysql中有哪些日志
数据库·mysql
天天喝旺仔14 小时前
MySQL索引优化实战:B+Tree原理、索引失效与覆盖索引调优
数据库·sql·mysql·性能优化
lqg_zone16 小时前
CentOS 7 虚拟机磁盘 I/O 卡顿排查实录:从 iostat 异常到虚拟盘后端故障的完整定位
linux·服务器·mysql·centos