Mysql Update Self Join,Increment Column值基于Group

问题描述 投票:0回答:3

我有一个表格,其结构类似于下面。

+ ---- + --------------- + ------- + | id |小组|价值| + ---- + --------------- + ------- + | 1 | g1 | null | | 2 | g1 | null | | 3 | g2 | null | | 4 | g2 | null | | 5 | g2 | null | | 6 | g3 | null | | 7 | g3 | null | | 8 | g4 | null | | 9 | g4 | null | + ---- + --------------- + ------- +

我需要更新值列,以便表格看起来像

+ ---- + --------------- + ------- + | id |小组|价值| + ---- + --------------- + ------- + | 1 | g1 | 1 | | 2 | g1 | 2 | | 3 | g2 | 1 | | 4 | g2 | 2 | | 5 | g2 | 3 | | 6 | g3 | 1 | | 7 | g3 | 2 | | 8 | g4 | 1 | | 9 | g4 | 2 | + ---- + --------------- + ------- +

基本上我是基于value列增加group列。

mysql sql sql-update auto-increment
3个回答
0
投票

你可以尝试下面 - 使用自我加入

DEMO

update tablename t
join
(select b.id,b.groupname,count(b.id) as val from t1 a
join t1 b on a.groupname=b.groupname
and a.id<=b.id
group by b.id,b.groupname
)d on t.id=d.id
set value=val

要么

如果你的mysql版本是8.0+,你可以使用row_number()函数

update tablename t
join
(
  select *, row_number() over(partition by groupname order by id) as rn from t1 
)d on t.id=d.id
set value=rn

0
投票

请试试这个我希望这对你有用

Update A 
set value = _val
from @tblName As A
INNER JOIN (
SELECT id,Row_NUMBER() over(partition by [group] order by id) as _val  from  @tblName
)As B ON A.id = B.id

0
投票

在旧版本的MySQL中,变量是最简单的方法:

set @rn := 0;
set @grp := '';

update t
    set value = (@rn := if(@grp = t.group, @rn + 1,
                           if(@grp := t.group, 1, 1)
                          )
                )
    order by group, id;

在MySQL 8.0中,使用fa06的第二个查询。

© www.soinside.com 2019 - 2024. All rights reserved.