我需要进行一个查询,每次只将一列的值向上移动 ↑ 一行:
+------------+----------------+
| anotherCOL | values_to_loop |
+------------+----------------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
| 7 | 7 |
| 8 | 8 |
| 9 | 9 |
| 10 | 10 |
+------------+----------------+
所以,下次我运行查询时,它应该看起来像这样
+------------+----------------+
| anotherCOL | values_to_loop |
+------------+----------------+
| 1 | 2 |
| 2 | 3 |
| 3 | 4 |
| 4 | 5 |
| 5 | 6 |
| 6 | 7 |
| 7 | 8 |
| 8 | 9 |
| 9 | 10 |
| 10 | 1 |
+------------+----------------+
我只需要循环一个 MYSQL COLUMN 的值,就像每次运行查询时将值向上移动一 ROW UP ↑ 一样。
注意:所提供的表格仅供引用,数据不同。
最佳答案
以下是如何在单个 UPDATE 查询中执行此操作:
UPDATE tbl a
INNER JOIN (
SELECT values_to_loop
FROM (SELECT * FROM tbl) c
ORDER BY anotherCOL
LIMIT 1
) b ON 1 = 1
SET a.values_to_loop =
IFNULL(
(SELECT values_to_loop
FROM (SELECT * FROM tbl) c
WHERE c.anotherCOL > a.anotherCOL
ORDER BY c.anotherCOL
LIMIT 1),
b.values_to_loop
)
它的工作原理如下:
- 更新表中的所有记录
- 加入临时表以检索 values_to_loop 的顶部值(将到达底部的值)
- 将 values_to_loop 的新值设置为下一行的相应值 (
c.anotherCOL > a.anotherCOL ... LIMIT 1
)
注意事项:
- 即使 anotherCOL 中存在间隙(例如:1、2、3、6、9、15),这也有效
- 需要使用
(SELECT * FROM tbl)
而不是tbl
因为不允许在更新查询中使用要更新的表
在 anotherCOL 中没有间隙时查询速度更快
如果 anotherCOL 中的值没有间隙,您可以使用下面的查询,如果您在 anotherCOL 上有索引,该查询应该运行得非常快:
UPDATE tbl a
LEFT JOIN tbl b on b.anotherCOL = a.anotherCOL + 1
LEFT JOIN (
SELECT values_to_loop
FROM tbl
WHERE anotherCOL = (select min(anotherCOL) from tbl)
) c ON 1 = 1
SET a.values_to_loop = ifnull(
b.values_to_loop,
c.values_to_loop
)
关于mysql - 查询列中的循环值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31848232/