Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL-使用递增值更新列,该值将在每次满足条件时重置_Mysql_Sql_Database_Cursor - Fatal编程技术网

MYSQL-使用递增值更新列,该值将在每次满足条件时重置

MYSQL-使用递增值更新列,该值将在每次满足条件时重置,mysql,sql,database,cursor,Mysql,Sql,Database,Cursor,我有这张桌子 ++++++++++++++++++++++++++++++++ + itemid + name + group_id + ++++++++++++++++++++++++++++++++ + 1 + name 1 + 0 + + 2 + name 2 + 1 + + 3 + name 3 + 1 + + 4 + name 4 + 0 + + 5 +

我有这张桌子

++++++++++++++++++++++++++++++++ + itemid + name + group_id + ++++++++++++++++++++++++++++++++ + 1 + name 1 + 0 + + 2 + name 2 + 1 + + 3 + name 3 + 1 + + 4 + name 4 + 0 + + 5 + name 5 + 0 + + 6 + name 6 + 2 + + 7 + name 7 + 2 + + 8 + name 8 + 2 + + 9 + name 9 + 3 + + 10 + name 10 + 3 + + 11 + name 11 + 3 + + 12 + name 12 + 3 + + 13 + name 13 + 0 + + 14 + name 14 + 4 + + 15 + name 15 + 0 + ++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++ +itemid+名称+组\u id+ ++++++++++++++++++++++++++++++++ +1+名称1+0+ +2+姓名2+1+ +3+姓名3+1+ +4+名称4+0+ +5+名称5+0+ +6+姓名6+2+ +7+姓名7+2+ +8+名称8+2+ +9+姓名9+3+ +10+姓名10+3+ +11+名称11+3+ +12+姓名12+3+ +13+姓名13+0+ +14+姓名14+4+ +15+姓名15+0+ ++++++++++++++++++++++++++++++++ 我在此表中添加了一个默认值为0的新列组\u order\u id,以便在组中的项目之间有一个顺序

+++++++++++++++++++++++++++++++++++++++++++++++++ + itemid + name + group_id + group_order_id + +++++++++++++++++++++++++++++++++++++++++++++++++ + 1 + name 1 + 0 + 0 + + 2 + name 2 + 1 + 0 + + 3 + name 3 + 1 + 0 + + 4 + name 4 + 0 + 0 + + 5 + name 5 + 0 + 0 + + 6 + name 6 + 2 + 0 + + 7 + name 7 + 2 + 0 + + 8 + name 8 + 2 + 0 + + 9 + name 9 + 3 + 0 + + 10 + name 10 + 3 + 0 + + 11 + name 11 + 3 + 0 + + 12 + name 12 + 3 + 0 + + 13 + name 13 + 0 + 0 + + 14 + name 14 + 4 + 0 + + 15 + name 15 + 0 + 0 + +++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++ +itemid+名称+组id+组订单id+ +++++++++++++++++++++++++++++++++++++++++++++++++ +1+名称1+0+0+ +2+名称2+1+0+ +3+姓名3+1+0+ +4+名称4+0+0+ +5+名称5+0+0+ +6+姓名6+2+0+ +7+名称7+2+0+ +8+名称8+2+0+ +9+名称9+3+0+ +10+姓名10+3+0+ +11+名称11+3+0+ +12+姓名12+3+0+ +13+名称13+0+0+ +14+姓名14+4+0+ +15+姓名15+0+0+ +++++++++++++++++++++++++++++++++++++++++++++++++ 我想更新列组\u order\u id,以便:

  • 如果组id=0,则组顺序id=0
  • 如果组id相同(0除外),则每个项目的组订单id值将从1-X递增,如下所示
+++++++++++++++++++++++++++++++++++++++++++++++++ +itemid+名称+组id+组订单id+ +++++++++++++++++++++++++++++++++++++++++++++++++ +1+名称1+0+0+ +2+姓名2+1+1+ +3+姓名3+1+2+ +4+名称4+0+0+ +5+名称5+0+0+ +6+姓名6+2+1+ +7+名称7+2+2+ +8+姓名8+2+3+ +9+姓名9+3+1+ +10+姓名10+3+2+ +11+名称11+3+3+ +12+姓名12+3+4+ +13+名称13+0+0+ +14+姓名14+4+1+ +15+姓名15+0+0+ +++++++++++++++++++++++++++++++++++++++++++++++++
有没有办法做到这一点?

您需要使用排名查询,然后将其用作UPDATE语句中的子查询,如下所示:

排名查询:

SELECT IF(@prev = group_id, @s:=@s+1, @s:=1) AS `group_order_id`, itemid, @prev:=group_id AS group_id
FROM table1, (SELECT @s:= 1, @prev:= 0) s
WHERE group_id <> 0
ORDER BY group_id
选择IF(@prev=group\u id,@s:=@s+1,@s:=1)作为'group\u order\u id',itemid,@prev:=group\u id作为group\u id'
从表1中,(选择@s:=1、@prev:=0)s
其中组id为0
按组\u id排序的订单
更新查询:

UPDATE table1, (
  SELECT IF(@prev = group_id, @s:=@s+1, @s:=1) AS `group_order_id`, itemid, @prev:=group_id AS group_id
  FROM table1, (SELECT @s:= 1, @prev:= 0) s
  WHERE group_id <> 0
  ORDER BY group_id
) AS t
SET table1.group_order_id = t.group_order_id
WHERE table1.itemid = t.itemid
更新表1(
选择IF(@prev=group\u id,@s:=@s+1,@s:=1)作为'group\u order\u id',itemid,@prev:=group\u id作为group\u id'
从表1中,(选择@s:=1、@prev:=0)s
其中组id为0
按组\u id排序的订单
)AS t
设置表1.group\u order\u id=t.group\u order\u id
其中table1.itemid=t.itemid

工作演示:

如果您不在乎它们是否从1开始,而只希望它们按升序排列,则可以更新。。。设置组\u顺序\u id=itemid,其中组\u id=0按itemid ASC排序,假设itemid为primary.:)
UPDATE table1, (
  SELECT IF(@prev = group_id, @s:=@s+1, @s:=1) AS `group_order_id`, itemid, @prev:=group_id AS group_id
  FROM table1, (SELECT @s:= 1, @prev:= 0) s
  WHERE group_id <> 0
  ORDER BY group_id
) AS t
SET table1.group_order_id = t.group_order_id
WHERE table1.itemid = t.itemid