mysql - 查询列中的循环值

标签 mysql sql database

我需要进行一个查询,每次只将一列的值向上移动 ↑ 一行:

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

它的工作原理如下:

  1. 更新表中的所有记录
  2. 加入临时表以检索 values_to_loop 的顶部值(将到达底部的值)
  3. 将 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/

相关文章:

mysql - 如何在我的查询中显示零计数?

mysql - 如何从 if 语句中的多个选择中将值返回到 View ?

sql - 多种内容类型的评论表的最佳解决方案

database - 自动更新 Access 数据库(无法链接)

android - 地理编码器在模拟器测试期间找不到位置

sql - 我怎么知道日期是否在特定时间段内

java - 获取正确的 DAY_OF_WEEK 字符串

mysql - 关闭连接后访问MySQL

java - 通过存储过程的多个结果集输出进行查询以获取列的值

mysql - 需要mysql查询吗?选择值(value)100000以上的价格