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

结语

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

相关推荐
小林ixn18 分钟前
从零设计一个博客系统的数据库:表结构、索引与约束的实战思考
数据库·后端·mysql
GreatSQL社区1 小时前
少敲一个字母,GreatSQL 对所有查询“已读不回”
数据库·mysql·greatsql
qq_339191143 小时前
mysql磁盘占用排查,mysql存储空间占比统计,mysql判断哪张表占用磁盘空间大
数据库·mysql
程序员-Benothing6 小时前
MySQL 二级索引有 MVCC 快照吗?
数据库·mysql
Java.熵减码农9 小时前
MySQL 远程连接故障排查全记录(Linux + Docker + Navicat)
linux·mysql·docker
拾光Ծ9 小时前
【MySQL】基础入门:库操库、数据表操作与数据类型详解
数据库·sql·mysql·数据类型·库操作·表操作
夜雪一千10 小时前
MySQL Insert Intention Lock 插入意向锁是什么
数据库·mysql
Nontee18 小时前
MySQL 插入冲突了怎么办?两种处理方式入门笔记
数据库·笔记·mysql
devilnumber21 小时前
MySQL 性能优化・诗意化记忆
数据库·mysql·性能优化