【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,因为一个单子只会返回一个状态,就达到效果了。

结语

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

相关推荐
不想写bug呀10 小时前
MySQL索引介绍
数据库·mysql
北辰当尹11 小时前
【小迪安全2023】day42 php应用&mysql架构&sql注入&跨库查询&文件读写&权限操作
mysql·安全·php
从天而降的扣篮13 小时前
MySQL自动添加分区表的函数
数据库·mysql
悄悄敲敲敲13 小时前
MySQL 事务
数据库·mysql
Linux蓝魔14 小时前
外网同步清华源mysql到内网搭建mysql源
数据库·mysql
Dxy123931021615 小时前
告别默认排序:MySQL自定义排序的“炼金术”
android·数据库·mysql
Chan1615 小时前
《MYSQL技术内幕》| InnoDB存储引擎与日志文件
java·大数据·spring boot·mysql·架构·java-ee·intellij-idea
无限码力15 小时前
华为OD技术面真题 - 数据库Mysql - 1
mysql·华为od·华为od技术面真题·华为od技术面八股·华为od技术面mysql八股
玄同76516 小时前
SQLAlchemy 模型定义完全指南:从基础到进阶的 ORM 实战
人工智能·python·sql·mysql·机器学习·自然语言处理·database
betazhou16 小时前
mysql备份脚本
android·mysql·adb·数据库备份