我需要創建一個查詢,一次只將一列的值移動一行↑:
+------------+----------------+
| 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
)