我需要为我的餐桌制作新专栏 - >叫Order(新专栏)。使用rails迁移我需要添加新列并立即设置它的订单号,但这需要由product_id完成。
我的意思是我需要类似的东西:
product_id |为了
1 ------------> 1
1 ------------> 2
1 ------------> 3
2 ------------> 1
2 ------------> 2
有办法吗?
编辑: 您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在第15行的''order'= t1.'order''附近使用正确的语法:
update product_submissions t
join (
select
id,
product_id,
'order' from (
select id,
product_id,
@rn:= if(@prev = product_id,@rn:=@rn+1,1) as 'order',
@prev:=product_id
from product_submissions,
(select @rn:=0,@prev:=0)r
order by product_id,id
)x
)t1 on t1.id=t.id set t.'order' = t1.'order'
答案 0 :(得分:0)
考虑以下
mysql> create table test (id int ,product_id int);
Query OK, 0 rows affected (0.14 sec)
mysql> insert into test values (1,1),(2,1),(3,1),(4,2),(5,2);
现在让我们创建订单
select
product_id,
`order` from (
select
product_id,
@rn:= if(@prev = product_id,@rn:=@rn+1,1) as `order`,
@prev:=product_id from test,(select @rn:=0,@prev:=0)r
order by product_id,id
)x ;
这会给你一些东西
+------------+-------+
| product_id | order |
+------------+-------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
+------------+-------+
现在让我们在更新命令中使用,但在此之前,我们可以添加列(在您的情况下已经存在)
mysql> alter table test add column `order` int ;
Query OK, 5 rows affected (0.29 sec)
mysql> select * from test ;
+------+------------+-------+
| id | product_id | order |
+------+------------+-------+
| 1 | 1 | NULL |
| 2 | 1 | NULL |
| 3 | 1 | NULL |
| 4 | 2 | NULL |
| 5 | 2 | NULL |
+------+------------+-------+
5 rows in set (0.00 sec)
最后更新命令
update test t
join (
select
id,
product_id,
`order` from (
select id,
product_id,
@rn:= if(@prev = product_id,@rn:=@rn+1,1) as `order`,
@prev:=product_id
from test,(select @rn:=0,@prev:=0)r
order by product_id,id
)x
)t1 on t1.id=t.id set t.`order` = t1.`order`
mysql> select * from test ;
+------+------------+-------+
| id | product_id | order |
+------+------------+-------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
| 4 | 2 | 1 |
| 5 | 2 | 2 |
+------+------------+-------+
5 rows in set (0.00 sec)