We have an application where we have some learning path and each learning path is associated with some courses. The association between learning path and courses is stored in a mysql table. Now we also want to store course position in learning path to course mapping, so I have added another column ‘position’ in the table and I want to backfill existing data in it by a query in such a way that each course is assigned a number starting from 1 in any random way(Number should start from 1 for every learning path). For example,
LP1|C1 LP1|C1|1 LP1|C2 ==> LP1|C2|2 LP1|C3 LP1|C3|3 LP2|C1 LP2|C1|1 LP2|C5 LP2|C5|2
Advertisement
Answer
If you are running MysQL 8.0, you can just use row_number()
for this:
select learning_path, course, row_number() over(partition by learning_path order by course) position from mytable
If you need an update
query:
update mytable t inner join ( select learning_path, course, row_number() over(partition by learning_path order by course) position from mytable ) t1 on t1.learning_path = t.learning_path and t1.course = t.course set t.position = t1.position
In earlier versions, one option is:
update mytable t inner join ( select learning_path, course, (select 1 + count(*) from mytable t1 where t1.learning_path = t.learning_path and t1.course < t.course) position from mytable t ) t1 on t1.learning_path = t.learning_path and t1.course = t.course set t.position = t1.position