mysql – 查询列中的循环值

我需要创建一个查询,一次只将一列的值移动一行↑:

    +------------+----------------+
    | 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
)
点赞