首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在mysql中生成序号

如何在mysql中生成序号
EN

Stack Overflow用户
提问于 2018-03-09 22:43:49
回答 2查看 223关注 0票数 1

我有以下数据:

代码语言:javascript
复制
+--------+--------+--------+--------+----------+
| 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列)?

因此,查询结果的显示如下:

代码语言:javascript
复制
+--------+--------+--------+--------+----------+
| 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  |
+--------+--------+--------+--------+----------+
EN

回答 2

Stack Overflow用户

发布于 2018-03-09 22:46:14

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

代码语言:javascript
复制
select t.*,
       (select count(distinct t2.idorder)
        from t t2
        where t2.idcust = t.idcust and t2.idtrx <= t.idtrx
       ) as orderseq
from t;

注意:这不会将值格式化为字符串。我认为整数在任何情况下都更有用(将其格式化为字符串非常简单)。

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

代码语言:javascript
复制
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更新表中的列

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2018-03-10 11:23:35

是的,工作得很好。

-- t_orders的表结构

DROP TABLE IF EXISTS t_orders;CREATE TABLE t_orders ( IDTRX int(11) NOT NULL t_ordersIDCUST varchar(10) DEFAULT NULL,ITEM varchar(100) DEFAULT NULL,IDORDER varchar(10) DEFAULT NULL,ORDERSEQ varchar(10) NOT NULL,主键(IDTRX) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;

-- t_orders的记录

开始;插入到t_orders值(1,'A','SHOES','C18001','');插入到t_orders值(2,'A','BAG','C18001','');插入到t_orders值(3,'A','TV','C18005','');插入到t_orders值(4,'A','IPHONE','C18008','');INSERT INTO t_orders VALUES (5,'B','BAG','C18002','');INSERT INTO INTO t_orders VALUES (6,'B','TV','C18003','');INSERT INTO INTO IPHONE VALUES (7,'C','IPHONE','C18006','');

下面是update ORDERSEQ列的查询解决方案:

update t_orders a join (select t.*,(select CONCAT('ORDER-',count(distinct t2.IDORDER)) from t_orders t2 where t2.IDCUST = t.IDCUST t_orders t2.IDTRX <= t.IDTRX ) as new_orderseq t_orders t_orders t) tt on a.IDTRX = tt.IDTRX set a.ORDERSEQ = new_orderseq;

感谢所有人

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49196188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档