mysql,更新foreach类

时间:2017-03-17 04:11:29

标签: mysql

这是一个非常简单的问题。它只有一张桌子! 我有一张书,每本书都有一个类别和一个数字。

SO I WANNA转换此

glmnet.basesurv

INTO THIS,

+--------------------------+
| book_id | category | num |
+--------------------------+
|    1    |    a     |  7  |
|    2    |    a     |  5  |
|    3    |    a     |  3  |
|    4    |    b     |  9  |
|    5    |    b     |  8  |
|    6    |    b     |  1  |
+--------------------------+

然后呢!

+--------------------------+
| book_id | category | num |
+--------------------------+
|    3    |    a     |  3  |
|    2    |    a     |  5  |
|    1    |    a     |  7  |
|    6    |    b     |  1  |
|    5    |    b     |  8  |
|    4    |    b     |  9  |
+--------------------------+

但是如何?!?!?!?!

创建表的脚本......

+--------------------------+
| book_id | category | num |
+--------------------------+
|    3    |    a     |  1  |
|    2    |    a     |  2  |
|    1    |    a     |  3  |
|    6    |    b     |  1  |
|    5    |    b     |  2  |
|    4    |    b     |  3  |
+--------------------------+

1 个答案:

答案 0 :(得分:1)

您可以使用用户变量按增加ID的顺序生成每个类别中的序列号。

如果您只想查询表格,请使用:

select
    b.id,
    b.category,
    @rn := if(@category = category, @rn + 1, if (@category := category, 1, 1)) num
from books b, (select @category := null, @rn := 0) t2
order by b.category, b.id

如果您想更新表格,请使用:

update books b1
join (
    select
        b.id,
        @rn := if(@category = category, @rn + 1, if (@category := category, 1, 1)) num
    from books b, (select @category := null, @rn := 0) t2
    order by b.category, b.id
) b2 on b1.id = b2.id
set b1.num = b2.num;

Demo

编辑:

根据已修改的问题,您可以改为使用order by b.category, b.num