1

写真の回転オフセットを更新する SQL クエリがあります。値が 3 でない限り、クエリは値に 1 を追加する必要があります。値が 3 の場合は、0 に戻す必要があります (90 度の回転が 4 回ある場合は、まったく回転しない場合と同じです)。

以下が最も効率的な方法であるかどうかはわかりません。私が持っているようにマッピングをリストする必要のない、より簡単な解決策の提案をいただければ幸いです。

しかし、私の質問は、MySQL 構文エラーが発生するのはなぜですか? SELECT サブクエリを単独で使用すると、期待どおりの結果が返されます。

UPDATE `photos` p SET p.rotational_offset=map.new_value INNER JOIN (
SELECT 0 AS rotational_offset, 3 AS new_value
UNION SELECT 1 , 0
UNION SELECT 2 , 1
UNION SELECT 3 , 2
) map ON p.rotational_offset=map.rotational_offset WHERE p.photo_id="22";
4

1 に答える 1

4

まず、より簡単な解決策は、MOD演算子 (%) を使用することです。

UPDATE photos
SET rotational_offset = (rotational_offset + 1) % 4
WHERE photo_id = '22'

オンラインで動作することを確認してください: sqlfiddle


そして今、実際にあなたの質問に答えるために...複数のテーブルの更新に正しい構文を使用していないため、エラーが発生します。テーブル参照は、SET句の前に最初に来ます。正しい構文は次のとおりです。

UPDATE [LOW_PRIORITY] [IGNORE]
table_references
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]

SET句の後に内部結合を配置したため、ステートメントは機能しません。修正版は次のとおりです。

UPDATE photos AS p
INNER JOIN
(
    SELECT 0 AS rotational_offset, 3 AS new_value
    UNION ALL SELECT 1 , 0
    UNION ALL SELECT 2 , 1
    UNION ALL SELECT 3 , 2
) AS map
ON p.rotational_offset = map.rotational_offset 
SET p.rotational_offset=map.new_value
WHERE photo_id = '22'
于 2012-11-30T16:27:32.823 に答える