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

结语

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

相关推荐
武子康1 小时前
大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
java·大数据·数据仓库·hive·hadoop·mysql
黑色叉腰丶大魔王1 小时前
《MySQL 数据库备份与恢复》
mysql
Ljw...1 小时前
索引(MySQL)
数据库·mysql·索引
OpsEye2 小时前
MySQL 8.0.40版本自动升级异常的预警提示
数据库·mysql·数据库升级
Ljw...2 小时前
表的增删改查(MySQL)
数据库·后端·mysql·表的增删查改
i道i9 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
Oak Zhang11 小时前
sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地
redis·mysql·缓存
久醉不在酒12 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql
WindFutrue12 小时前
使用Mybatis向Mysql中的插入Point类型的数据全方位解析
数据库·mysql·mybatis
一只爱撸猫的程序猿13 小时前
一个简单的Linux 服务器性能优化案例
linux·mysql·nginx