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

MySQL如何为查询结果中每个订单下的配送地点生成递增序列号

方案1:MySQL 8.0 + 版本(推荐)

直接用窗口函数ROW_NUMBER()实现分组排序,逻辑清晰性能更好:

SELECT 
  order_id,
  ship_location_id,
  ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY ship_location_id ASC) AS sequence
FROM (
  SELECT DISTINCT oh.order_id, oline.ship_location_id
  FROM op_order_header AS oh
  INNER JOIN op_order_line AS oline ON oh.order_id = oline.order_id
  INNER JOIN co_products AS pr ON oline.product_id = pr.product_id AND pr.inventory_type = 'inventory'
  WHERE oh.order_status = 'COMPLETE'
) t

说明:PARTITION BY order_id 表示按订单ID分组,同个订单内生成序号,ORDER BY 后面的字段可以根据你实际的排序需求调整,比如要按配送地点创建时间排序就替换成对应的时间字段即可。

方案2:MySQL 5.x 及更低版本(无窗口函数支持)

可以用用户变量模拟分组排序效果:

SELECT 
  order_id,
  ship_location_id,
  sequence
FROM (
  SELECT 
    t.order_id,
    t.ship_location_id,
    @seq := IF(@pre_order = t.order_id, @seq + 1, 1) AS sequence,
    @pre_order := t.order_id
  FROM (
    SELECT DISTINCT oh.order_id, oline.ship_location_id
    FROM op_order_header AS oh
    INNER JOIN op_order_line AS oline ON oh.order_id = oline.order_id
    INNER JOIN co_products AS pr ON oline.product_id = pr.product_id AND pr.inventory_type = 'inventory'
    WHERE oh.order_status = 'COMPLETE'
    ORDER BY oh.order_id ASC, oline.ship_location_id ASC
  ) t,
  (SELECT @seq := 0, @pre_order := NULL) init_vars
) res

说明:先初始化两个用户变量,@pre_order存储上一行的订单ID,@seq存储当前序号,遍历数据时如果当前订单ID和上一个一致就序号+1,否则重置为1,实现同订单内递增的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:24:06