我需要创建一个查询,一次只将一列的值移动一行↑:
+------------+----------------+
| 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
)
它的工作原理如下:
>更新来自tbl的所有记录
>使用临时表连接以检索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
)