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

时间:2014-01-17 09:34:35

标签: 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    +  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     +
++++++++++++++++++++++++++++++++

我在此表中添加了一个默认值为0的新列group_order_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        +
+++++++++++++++++++++++++++++++++++++++++++++++++

我想更新列group_order_id,以便:

  • 如果group_id = 0,group_order_id = 0
  • 如果group_id相同(0除外),则每个项目的group_order_id的值将从1-X增加,如下所示。
+++++++++++++++++++++++++++++++++++++++++++++++++
+ itemid +   name   + group_id + group_order_id +
+++++++++++++++++++++++++++++++++++++++++++++++++
+   1    +  name 1  +    0     +       0        +
+   2    +  name 2  +    1     +       1        +
+   3    +  name 3  +    1     +       2        +
+   4    +  name 4  +    0     +       0        +
+   5    +  name 5  +    0     +       0        +
+   6    +  name 6  +    2     +       1        +
+   7    +  name 7  +    2     +       2        +
+   8    +  name 8  +    2     +       3        +
+   9    +  name 9  +    3     +       1        +
+   10   +  name 10 +    3     +       2        +
+   11   +  name 11 +    3     +       3        +
+   12   +  name 12 +    3     +       4        +
+   13   +  name 13 +    0     +       0        +
+   14   +  name 14 +    4     +       1        +
+   15   +  name 15 +    0     +       0        +
+++++++++++++++++++++++++++++++++++++++++++++++++

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:2)

您需要使用排名查询,然后将其用作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

更新查询:

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

工作演示:http://sqlfiddle.com/#!2/08259/1/0

相关问题