假设我有一个这样的表格(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
列),最简单,最有效的查询或查询是什么?
答案 0 :(得分:4)
首先获取您想要交换的号码:
select max(num)
from TheTable
where num < 88
然后用它来交换数字:
update TheTable
set num = (67 + 88) - num
where num in (67, 88)
(但请注意,只有两个数字的总和仍然在数据类型的范围内时,这才有效。)
答案 1 :(得分: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);
答案 2 :(得分: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