创建按其顺序递增的新列

时间:2015-04-02 12:53:52

标签: mysql sql ruby-on-rails migration rails-migrations

我需要为我的餐桌制作新专栏 - >叫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'

1 个答案:

答案 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)