2012-04-10 18 views
0

私は対応するlisting_idと位置の画像のテーブルを持っています。SQL Update Whereステートメント

イメージ名、listing_id、位置

  • listing_idごとに複数の画像が存在する場合があります。
  • 各画像はlisting_id位置1の画像を持っていない場合、私はそのlisting_idための最も低い位置をとり、位置1に設定したい表示順序

を表す整数の位置を有します。

ような何か:@ypercubeによって構文の修正、クエリnの

update media_table set position = 1 where ... 
+0

'1 'は可能な限り低い位置にあるのでしょうか、そこに' 0'を置くことは可能ですか? –

答えて

3

MySQLのOW作品:

UPDATE media_table m 
JOIN (
    SELECT listing_id, min(position) AS position 
    FROM media_table 
    GROUP BY listing_id 
    HAVING min(position) > 1 
    ) x ON (m.listing_id, m.position) = (x.listing_id, x.position) 
SET m.position = 1; 

説明:

サブクエリでは最小positionは、これらの調査結果はすぐに行を更新する1.より大きい場合、すべてのlinsting_idを見つけます。私は(listing_id, position)がユニークであると仮定します。

See working demo for MySQL.

+1

ロジックは100%サウンドですが、これが(MySQLのねじれた 'UPDATE'構文で)うまくいきません。 –

+0

@ypercube:そうです、その構文はMySQLでは動作しません。タグを逃した。私はうまくいく代替のソリューションを提供しました。 –

+0

@ypercube:あなたの代わりの構文がはっきりと働くので、私はマニュアルを誤解しているはずです。サブクエリから選択して関連するテーブルを更新するのは問題ありません。 –

0
UPDATE media_table 
SET position=(SELECT MIN(position) FROM media_table) 
WHERE listing_id IS NULL; 
+0

このようなものが欲しいですか? – Teja

+0

正確ではありませんが、ありがとう!アーウィンはそれを釘付けにした。 – Bryan

0

これを試してみてください:

update images i1, 
(select i1.image_name, i1.listing_id from images i1 
    left join images i2 
    on i1.listing_id = i2.listing_id and i1.position > i2.position 
    where i2.position is null and i1.position != 1 
) f 
set position = 1 
where i1.image_name = f.image_name and i1.listing_id = f.listing_id; 

これは、あなたがimage_name, listing_idでレコードを識別することができますを前提としています。 image_nameでこれを行うことができれば、listing_idの比較と選択を削除できるので、クエリはより簡単になります。

関連する問題