1

このようなテーブルがあるとしましょう(num列にインデックスが付けられています):

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

そして、numがXである1つの行のnumを前のものと交換したい(によって定義された順序に基づくnum)。

たとえば、X=88 が与えられた場合、num取得するために 2 つの行の を更新したい

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

(ただし、これは 2 つの数値の合計がデータ型の範囲内にある場合にのみ機能することに注意してください。)

于 2013-09-13T13:10:49.073 に答える
3

これは@Guffaの回答に基づいています。2 つのクエリを 1 つに結合するだけです。

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 に答える