Mr Umbz
Mr Umbz

Reputation: 11

MYSQL - Updating a column with incrementing value that will reset everytime a condition is met

I have this table.

++++++++++++++++++++++++++++++++
+ 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     +
++++++++++++++++++++++++++++++++

I added a new column group_order_id with default value 0 to this table so that there will be an order between items within a group.

+++++++++++++++++++++++++++++++++++++++++++++++++
+ 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        +
+++++++++++++++++++++++++++++++++++++++++++++++++

I want to update the column group_order_id such that:

+++++++++++++++++++++++++++++++++++++++++++++++++
+ 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        +
+++++++++++++++++++++++++++++++++++++++++++++++++

Is there a way to accomplish this?

Upvotes: 1

Views: 636

Answers (1)

Aziz Shaikh
Aziz Shaikh

Reputation: 16524

You need to use a ranking query and then use it as a subquery inside an UPDATE statement, like this:

Ranking Query:

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 query:

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

Working Demo: http://sqlfiddle.com/#!2/08259/1/0

Upvotes: 2

Related Questions