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

结语

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

相关推荐
betazhou39 分钟前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
喝醉的小喵2 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多3 小时前
Linux——mysql主从复制与读写分离
数据库·mysql
源远流长jerry3 小时前
MySQL的缓存策略
数据库·mysql·缓存
初次见面我叫泰隆4 小时前
MySQL——3、数据类型
数据库·mysql
weixin_472339465 小时前
MySQL MCP 使用案例
数据库·mysql
fengye2071618 小时前
在MYSQL中导入cookbook.sql文件
数据库·mysql·adb
拓端研究室TRL8 小时前
Python与MySQL网站排名数据分析及多层感知机MLP、机器学习优化策略和地理可视化应用|附AI智能体数据代码
人工智能·python·mysql·机器学习·数据分析
_星辰大海乀9 小时前
表的设计、聚合函数
java·数据结构·数据库·sql·mysql·数据库开发
数据库幼崽13 小时前
MySQL 8.0 OCP 1Z0-908 131-140题
数据库·mysql·ocp