【问题标题】:How to generate a sequence order number in mysql如何在mysql中生成一个序列号
【发布时间】:2024-01-07 05:39:01
【问题描述】:

我有以下数据:

+--------+--------+--------+--------+----------+
| IDTRX  | IDCUST | ITEM   | IDORDER| ORDERSEQ |
+--------+--------+--------+--------+----------+
|1       |  A     |  SHOES | C18001 |          |
|2       |  A     |  BAG   | C18001 |          |
|3       |  A     |  TV    | C18005 |          | 
|4       |  A     |  IPHONE| C18008 |          |
|5       |  B     |  BAG   | C18002 |          | 
|6       |  B     |  TV    | C18003 |          |
|7       |  C     |  IPHONE| C18006 |          |
+--------+--------+--------+--------+----------+

我想知道客户商品订购了多少次 如何查询填充IDCUST和IDORDER分组的订单序列(ORDERSEQ列)?

所以查询结果的显示是这样的:

+--------+--------+--------+--------+----------+
| IDTRX  | IDCUST | ITEM   | IDORDER| ORDERSEQ |
+--------+--------+--------+--------+----------+
|1       |  A     |  SHOES | C18001 | ORDER-1  |
|2       |  A     |  BAG   | C18001 | ORDER-1  |
|3       |  A     |  TV    | C18005 | ORDER-2  | 
|4       |  A     |  IPHONE| C18008 | ORDER-3  |
|5       |  B     |  BAG   | C18002 | ORDER-1  | 
|6       |  B     |  TV    | C18003 | ORDER-2  |
|7       |  C     |  IPHONE| C18006 | ORDER-1  |
+--------+--------+--------+--------+----------+

【问题讨论】:

    标签: mysql sql sequence


    【解决方案1】:

    一种方法使用相关子查询:

    select t.*,
           (select count(distinct t2.idorder)
            from t t2
            where t2.idcust = t.idcust and t2.idtrx <= t.idtrx
           ) as orderseq
    from t;
    

    注意:这不会将值格式化为字符串。我认为整数在任何情况下都更有用(并且格式化为字符串是微不足道的)。

    在很多情况下,变量是一种更有效的解决方案:

    select t.*,
           (@rn := if(@oc = concat_ws(':', t.idcust, t.idorder), @rn,
                      if(@oc := concat_ws(':', t.idcust, t.idorder), 1, 1)
                        )
                     )
           ) as orderseq
    from (select t.*
          from t
          order by t.idcust, t.idorder, t.idtrx
         ) t cross join
         (select @oc := '', @rn := 0) params;
    

    编辑:

    您可以使用join 更新表中的列:

    update t join
           (select t.*,
                   (select count(distinct t2.idorder)
                    from t t2
                    where t2.idcust = t.idcust and t2.idtrx <= t.idtrx
                   ) as new_orderseq
            from t
           ) tt
           on t.idtrx = tt.idtrx
        set orderseq = new_orderseq;  -- or whatever string formatting you want
    

    【讨论】:

    • 感谢您的回答,我的意思是如何更新列ordereq?
    【解决方案2】:

    是的,工作得很好。


    -- t_orders 的表结构


    如果存在则删除表t_orders; 创建表t_orders ( IDTRX int(11) NOT NULL AUTO_INCREMENT, IDCUST varchar(10) 默认为空, ITEM varchar(100) 默认为空, IDORDER varchar(10) 默认为空, ORDERSEQ varchar(10) 非空, 主键 (IDTRX) ) ENGINE=InnoDB AUTO_INCREMENT=8 默认字符集=latin1;


    -- t_orders的记录


    开始; 插入t_orders 值(1,'A','鞋子','C18001',''); 插入t_orders 值(2,'A','BAG','C18001',''); 插入t_orders 值(3,'A','TV','C18005',''); 插入t_orders 值(4,'A','IPHONE','C18008',''); 插入t_orders 值(5,'B','BAG','C18002',''); 插入t_orders 值(6,'B','TV','C18003',''); 插入t_orders 值(7,'C','IPHONE','C18006',''); 提交;

    还有这个更新 ORDERSEQ 列的查询解决方案:

    更新 t_orders 一个连接 (选择 t.*, (select CONCAT('ORDER-',count(distinct t2.IDORDER)) 从 t_orders t2 其中 t2.IDCUST = t.IDCUST 和 t2.IDTRX

    谢谢大家

    【讨论】: