mysql,更新foreach类别

mysql,更新foreach类别,mysql,Mysql,这是一个非常简单的问题。只有一张桌子! 我有一张书桌,每本书都有一个类别和编号 所以我想改变这个 +--------------------------+ | book_id | category | num | +--------------------------+ | 1 | a | 7 | | 2 | a | 5 | | 3 | a | 3 | | 4 | b | 9

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

所以我想改变这个

+--------------------------+
| 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  |
+--------------------------+
但是怎么做

创建表的脚本

drop table if exists books;

CREATE TABLE books(
id int AUTO_INCREMENT,
category varchar(30),
num int,
PRIMARY KEY (id)
);

insert into books (category,num)
values
('a',7),
('a',5),
('a',3),
('b',9),
('b',8),
('b',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;
如果要更新表,请使用:

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;
编辑:
根据编辑后的问题,您可以使用
按b.category排序,b.num

那么您想在同一组中继续递增数字,然后重新启动一个新组吗?对不起,我忘了说“按'num'排序”,而不是说1,2,3。。。但我认为你所做的会奏效的!谢谢