I have this table:
SELECT * FROM items
id | item | position
---|-----------|----------
1 | USB cable | 0
2 | SD card | 4
3 | Mouse | 2
4 | Keyboard | 0
5 | Monitor | 3
Sorting this table gives this result:
SELECT * FROM items ORDER BY position
id | item | position
---|-----------|----------
4 | Keyboard | 0
1 | USB cable | 0
3 | Mouse | 2
5 | Monitor | 3
2 | SD card | 4
Now I want to update the table and save the order in the position column:
SELECT * FROM items
id | item | position
---|-----------|----------
4 | Keyboard | 1
1 | USB cable | 2
3 | Mouse | 3
5 | Monitor | 4
2 | SD card | 5
Can this be done with a single query or do I have to manually loop over all rows and do a manual update?
In case the order is not fully defined (e.g. for USB cable and Keyboard above) I just arbitrarily decided the order.
Best Answer
Note: the order of "Keyboard" and "USB cable" is arbitrary. They both have position = 0
To tie-break positions based on item, add a secondary sort
If you have duplicate position,item pairs this will be arbitrary too...