MySQL如何查询一对多关联表中子表指定列全非空的订单状态
多表关联订单状态查询方案
表结构说明
现有两张一对多关联的业务表:
- 主表
order(订单主表)
包含字段:order_id(订单唯一标识,主键)、order_date(订单创建日期) - 子表
detail_order(订单明细表)
包含字段:detail_order_id(明细唯一标识,主键)、order_id(关联主表的订单ID)、is_finished(单条明细的完成状态)
状态判定规则
- 同一订单下所有明细的
is_finished字段不存在NULL值,订单状态标记为 finished - 同一订单下存在任意一条明细的
is_finished为NULL,订单状态标记为 not finish
实现SQL
SELECT o.order_id, CASE WHEN COUNT(d.is_finished) = COUNT(*) THEN 'finished' ELSE 'not finish' END AS order_status FROM `order` o LEFT JOIN detail_order d ON o.order_id = d.order_id GROUP BY o.order_id ORDER BY o.order_id;
逻辑说明:SQL标准中
COUNT(指定字段)统计时会自动跳过NULL值,因此当COUNT(is_finished)和统计总明细条数的COUNT(*)相等时,说明该订单下所有明细的is_finished都不为空,符合完成状态判定条件,反之则存在未完成的明细。
预期输出结果
| order_id | order_status |
|---|---|
| 1 | not finish |
| 2 | finished |
| 3 | not finish |
内容的提问来源于stack exchange,提问作者kuin
相关产品推荐
相关产品推荐

