我有以下数据:
+--------+--------+--------+--------+----------+
| 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 |
+--------+--------+--------+--------+----------+发布于 2018-03-09 22:46:14
一种方法使用相关子查询:
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发布于 2018-03-10 11:23:35
是的,工作得很好。
-- t_orders的表结构
DROP TABLE IF EXISTS t_orders;CREATE TABLE t_orders ( IDTRX int(11) NOT NULL t_orders,IDCUST 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;
感谢所有人

https://stackoverflow.com/questions/49196188
复制相似问题