2

私がこれについて間違った方法で考えているかどうかはよくわからないので、もしそうなら、おそらく誰かが私を正しい方向に向けるでしょう. しかし、私がその概念を見逃しているだけなら、おそらくそれについて助けを得ることができます.

だから、どうにかして私が勝つ..または何か。

私がやりたいのは、データベース内のテーブルを指定して、単一のクエリで特定の値を別の行に移動する、このようなものです。

明確にするために、次の表を例にとります。

id I value
0 I 5
1 I 2

テーブルが次のようになるようにid=0のを移動したい:

id I value
0 I 0
1 I 5

(OBSERVE! id=1の値は重要ではなく、上書きされ、id=0 _value_ はゼロに設定されているだけです)

これまでの私の試みは、次のようなクエリでした。

UPDATE atable 
SET item = CASE id 
WHEN '1' THEN (SELECT value FROM atable WHERE id='1') 
WHEN '0' THEN '0' 
END;

ただし、これは有効ではなく、その方法でSELECTを使用することはできません。したがって、私の見解#2は次のとおりです。

UPDATE atable 
SET item=(SELECT value FROM atable WHERE id='1') 
WHERE id='0';

どの種類が機能しますが、 id=0にvalue=0を設定する方法が見つかりません

それがすべて理にかなっていて、すべてがとりとめのないものではないことを願っています.

すべてを明確 にするために、値をある行から別の行に移動したいので、コピーではそれを理解できません。そして、1 つのクエリで実行したいのですが、もちろん、2 つのクエリに分割することもでき、簡単です。

これを読んでくれてありがとう。

4

4 に答える 4

2

これは役立つと思います-

UPDATE atable a,
(SELECT value, id FROM atable) c
SET a.value = c.value 
WHERE a.id < @MAX(id)
AND a.id = c.id + 1;

唯一の条件は、IDが順番に並んでいて、セーフアップデートモードがアクティブになっていないことです。

于 2012-05-21T21:43:17.577 に答える
1

これは1つのクエリで実行できますが、IDがシーケンシャルであると予想される場合にのみ可能です。

update a set a.value=isnull(b.value,0) from atable a left outer join atable b on a.id=b.id+1

編集

update a set a.value=ifnull(b.value,0) from atable a left outer join atable b on a.id=b.id+1
于 2012-05-21T21:35:39.437 に答える
1

このタイプのことは、通常、アトミック操作として動作させるためにトランザクションで実行されます。例えば:

start transaction;    
set @myval = (select value from atable where id = 0);
update atable set value = @myval where id = 1;
update atable set value = 0 where id = 0;
commit;

単一のステートメントで最初の行から別の行に値を「移動」することは可能ですが、見た目が非常に悪く、おそらく効率的ではありません。以下はそれを行うかもしれないと思いますが、それは良い考えではないと思います。

update atable set value = 
      (select x.value from 
            (select value from atable where id = 0) x) 
   where id = 1;
于 2012-05-21T21:28:47.543 に答える
0

「簡単な」ソリューションを使用していると思います。実際には、動的に読み取る必要があるとは言いませんが、問題に関するより多くの情報を持っているからです。

したがって、私の特定の問題については、次のように解決することにしました。

これらのパラメーターがあります(phpで):

$fromSlot, $toSlot, $itemID

$itemIDそして、あるスロットから別のスロットに移動したいです。

しかし、私はアイテムの id を知っているので、それを に挿入してアイテムをゼロ$toSlotに設定することもできます。$fromSlot

基本的に、テーブルには一意のキーであるslotID, itemIDwhereがあり、そのスロット内のアイテムを参照するための ID です。slotIDitemID

私のクエリは次のようになりました。

UPDATE `slots` SET item = CASE slotID
WHEN '$fromSlot' THEN '0'
WHEN '$toSlot' THEN '$itemID'
END;

$fromSlotこのようにして、最初に をゼロに設定してから、そのゼロを に「コピー」する可能性があるという事実を心配する必要はありません$toSlot

すべてを一緒に送信することは避けたかったの$itemIDですが、実際には大きな問題ではなく、2 つのクエリを作成してから余分なパラメーターを送信することを避けていることに気付きました。

別の方法としては、送信をスキップして$itemIDから、最初に with を更新$toSlotUPDATE slots SET item = (SELECT item FROM slots WHERE slotID='$fromSlot')、次に 2 番目のクエリを更新して、$fromSlot.item

こうすれば解決します。

もちろん、クリーバーのアイデアなどは大歓迎ですが、これを私の受け入れられた回答としてマークします。

他に何もないとしても、人々が私の一連の考えをたどり、なぜ私がこの質問をした (そして答えた -_-) のかを理解するのに役立つかもしれません。

于 2012-05-22T08:02:00.630 に答える