1

假设我有一个这样的表(num列被索引):

+-----+--------------+
| num | lots of cols |
+-----+--------------+
|  31 | bla 31       |
|  67 | bla 67       |
|  88 | bla 88       |
|  89 | bla 89       |
+-----+--------------+

我想将 num 为 X 的一行的 num 与前一行交换(基于 定义的顺序num)。

例如,如果给定 X=88,我想更新num两行的

+-----+--------------+
| num | lots of cols |
+-----+--------------+
|  31 | bla 31       |
|  67 | bla 88       |
|  88 | bla 67       |
|  89 | bla 89       |
+-----+--------------+

在不获取所有列的情况下执行此操作的最简单和最有效的查询是什么(如果可能,只更新num列)?

4

3 回答 3

4

首先获取要交换的号码:

select max(num)
from TheTable
where num < 88

然后用它来交换数字:

update TheTable
set num = (67 + 88) - num
where num in (67, 88)

(但请注意,这仅在两个数字的总和仍在数据类型范围内时才有效。)

于 2013-09-13T13:10:49.073 回答
3

这是基于@Guffa 的回答。它只是将两个查询合二为一:

update TheTable cross join
       (select max(num) as num
        from TheTable
        where num < 88
       ) other
    set num = (other.num + 88) - num
    where num in (other.num, 88);
于 2013-09-13T13:26:37.637 回答
0

我的解决方案:

SET @swap = 88;

UPDATE tableName
SET
  num = CASE WHEN num=@swap THEN
          (SELECT * FROM (SELECT MAX(num) FROM tableName WHERE num<@swap) s)
        ELSE @swap END
WHERE
  num <= @swap
ORDER BY
  num DESC
LIMIT 2
于 2013-09-13T13:28:09.343 回答