0

特定のグループ (vehID) に関連付けられている画像のテーブルがあり、各グループの順序を作成する必要があります。

これは、デザインするのを忘れたフィールドの最初の画像エントリの位置です。

で遊んでいますが@row、あまり遠くまで行きません。

set @row= 0;
select @row:=@row+1 as row, vehID,imgID from images group by vehID;

これにより行IDが得られますが、グループごとにリセットされません

各 vehID には 1 から n のエントリがあり、その値を計算し、計算された値でその行のエントリを更新したいと考えています。

vehID の変更時に @row を 0 にリセットする方法がわかりません。おそらくいくつかのサブセレクト。

Select を取得して UPDATE をコーディングする方法についてのアドバイスを得ることができれば、明らかでない場合はいただければ幸いです。

Update images set imgPosition = Calculated Value where imgID = current imgID
4

1 に答える 1

4

以前の vehID を保持する別の変数を宣言するだけです。次に、IF ステートメントを使用して、vehID を前のものと比較し、それに応じて行番号を設定できます。次に、前の vehID 変数を現在の行の vehID に設定します。

「group by」を「order by」に変更したことに注意してください。これには次の 2 つの理由があります。

1 - すべての行を一覧表示する

2-同じIDの行が互いに続いていることを確認します。そうしないと、以前の値との比較が正しくなくなります。

最後に、前の変数をリセットして現在の行の値を保持する前に、前の vehID 値を比較し、rownum が何であるかを確認してください。

set @previous_vehID= 0;
set @row= 0;
select if(@previous_vehID=vehID, @row:=@row+1, @row:=1) as row,@previous_vehID:=vehID, vehID,imgID from images order by vehID

編集:

更新部分を見逃してしまいました。そのためにクロステーブル更新を試すことができます:

set @previous_vehID= 0;
set @row= 0;
update images a, (
    select if(@previous_vehID=vehID, @row:=@row+1, @row:=1) as row,@previous_vehID:=vehID, vehID,imgID from images order by vehID ) aa
set a.imgPosition = aa.row where a.vehID=aa.vehID and a.imgID=aa.imgID

上記は、単一のステートメント/クエリで選択と更新を行います。機能しない場合は、結果を一時テーブルに挿入し、それらを使用して別のステートメントで更新を行います。

于 2012-07-21T17:41:18.733 に答える