MariaDB中如何根据支付类型调整订单ID显示格式?
问题描述
在MariaDB中拥有订单表(Orders)和包裹表(Parcels),表结构如下:
Orders表
| id | order_id | customer | payment |
|---|---|---|---|
| 1 | 100 | customer 1 | COD |
| 2 | 101 | customer 2 | paid |
| 3 | 102 | customer 3 | COD |
| 4 | 103 | customer 4 | COD |
| 5 | 104 | customer 5 | paid |
Parcels表
| id | order_id | parcels | weight | width | height | length |
|---|---|---|---|---|---|---|
| 1 | 100 | 1 | 5 | 10 | 10 | 20 |
| 2 | 101 | 1 | 5 | 10 | 10 | 20 |
| 3 | 102 | 1 | 5 | 10 | 10 | 20 |
| 4 | 103 | 1 | 10 | 20 | 20 | 30 |
| 5 | 103 | 1 | 15 | 30 | 30 | 40 |
| 6 | 103 | 1 | 20 | 20 | 20 | 40 |
| 7 | 104 | 1 | 12 | 32 | 32 | 42 |
| 8 | 104 | 1 | 18 | 40 | 40 | 50 |
| 9 | 104 | 1 | 25 | 40 | 45 | 50 |
现有视图定义:
CREATE OR REPLACE VIEW SHIPPING_LABELS AS SELECT DISTINCT(ORD.order_id) AS order_id, ORD.customer AS customer, ORD.payment AS payment FROM orders ORD LEFT JOIN parcels PAR ON (ORD.order_id = PAR.order_id) ORDER BY ORD.order_id DESC
当前视图每个订单仅显示一行,现需按支付类型调整逻辑:
- 若支付类型为
COD,即使对应多个包裹也仅显示一行 - 若支付类型为
paid,需为每个包裹生成带序号的订单ID(如104_1、104_2)
请问能否用纯SQL实现?
解决方案
可以用纯SQL实现,核心思路是通过条件分支+窗口函数+联合查询区分两种支付类型的处理逻辑:
以下是调整后的视图SQL:
CREATE OR REPLACE VIEW SHIPPING_LABELS AS -- 处理paid类型订单:为每个包裹生成带序号的订单ID SELECT CONCAT(ORD.order_id, '_', ROW_NUMBER() OVER (PARTITION BY ORD.order_id ORDER BY PAR.id)) AS order_id, ORD.customer AS customer, ORD.payment AS payment FROM orders ORD JOIN parcels PAR ON ORD.order_id = PAR.order_id WHERE ORD.payment = 'paid' UNION ALL -- 处理COD类型订单:仅保留单条订单记录 SELECT ORD.order_id AS order_id, ORD.customer AS customer, ORD.payment AS payment FROM orders ORD WHERE ORD.payment = 'COD' ORDER BY order_id DESC;
逻辑说明
- paid订单处理:用
ROW_NUMBER()窗口函数按order_id分组,为每个包裹生成递增序号,再通过CONCAT()拼接成订单ID_序号的格式 - COD订单处理:直接选取订单信息,自然实现单条记录的效果
- 使用
UNION ALL而非UNION,避免不必要的去重操作,提升查询性能 - 最终按
order_id倒序排列,和原视图的排序逻辑保持一致
预期结果
执行该视图后,会得到如下输出:
| order_id | customer | payment |
|---|---|---|
| 104_3 | customer 5 | paid |
| 104_2 | customer 5 | paid |
| 104_1 | customer 5 | paid |
| 103 | customer 4 | COD |
| 102 | customer 3 | COD |
| 101_1 | customer 2 | paid |
| 100 | customer 1 | COD |
内容的提问来源于stack exchange,提问作者static
相关产品推荐
相关产品推荐

