You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MariaDB中如何根据支付类型调整订单ID显示格式?

问题描述

在MariaDB中拥有订单表(Orders)和包裹表(Parcels),表结构如下:

Orders表

idorder_idcustomerpayment
1100customer 1COD
2101customer 2paid
3102customer 3COD
4103customer 4COD
5104customer 5paid

Parcels表

idorder_idparcelsweightwidthheightlength
110015101020
210115101020
310215101020
4103110202030
5103115303040
6103120202040
7104112323242
8104118404050
9104125404550

现有视图定义:

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;

逻辑说明

  1. paid订单处理:用ROW_NUMBER()窗口函数按order_id分组,为每个包裹生成递增序号,再通过CONCAT()拼接成订单ID_序号的格式
  2. COD订单处理:直接选取订单信息,自然实现单条记录的效果
  3. 使用UNION ALL而非UNION,避免不必要的去重操作,提升查询性能
  4. 最终按order_id倒序排列,和原视图的排序逻辑保持一致

预期结果

执行该视图后,会得到如下输出:

order_idcustomerpayment
104_3customer 5paid
104_2customer 5paid
104_1customer 5paid
103customer 4COD
102customer 3COD
101_1customer 2paid
100customer 1COD

内容的提问来源于stack exchange,提问作者static

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 10:34:59