我有一个按名为position的列排序的表:
+------------+-------+----------+
| identifier | name | position |
+------------+-------+----------+
| 1 | test1 | 23 |
| 2 | test4 | 144 |
| 3 | test2 | 68 |
| 4 | test3 | 96 |
+------------+-------+----------+
我正尝试编写一个查询,它使用position列将各行隔开一个固定的数字偏移量,该偏移量基于已经存在的顺序(按position排序)。
假设我想用50的偏移量来分隔位置,表应该像这样更新
+------------+-------+----------+
| identifier | name | position |
+------------+-------+----------+
| 1 | test1 | 50 |
| 2 | test4 | 200 |
| 3 | test2 | 100 |
| 4 | test3 | 150 |
+------------+-------+----------+
这个任务很容易通过代码中的一个简单for循环来解决
rows = SELECT * FROM table ORDER BY position
for (i = 0; i < count(rows); i++) {
UPDATE table SET position = ((i + 1) * 50) WHERE identifier = rows[i].identifier
}
但是由于表可能包含许多行,我想直接编写一个SQL查询,我使用的是MariaDB 10。
为清晰起见编辑
运行UPDATE table SET position = position * 50
将按照插入的自然顺序更新行。我只需要保持ORDER BY position
的顺序,但将位置列偏移一个前缀值。
2条答案
按热度按时间yqyhoc1h1#
解决方法:
13z8s7eq2#
您可以使用一个子查询row_number over parttion来获取新的位置
fiddle