次の方法は、possessions
という事実に依存しています テーブルには主キーとcitizen_id
があります その一部ではありません。アイデアは次のとおりです:
-
更新のすべてのパラメーターを入力します(
citizen_id
およびgood_id
フィルタリングするには、citizen_id
の新しい値 および更新する行数)をストレージ、専用テーブル、または一時テーブルに追加します。 -
行番号を
possessions
に割り当てます(citizen_id, good_id)
での行の分割 次に、ランク付けされた行セットをパラメータテーブルに結合して、citizen_id
で元のフルセットをフィルタリングします。 およびgood_id
、および行数。 -
possessions
に参加する 主キー値の前回の結合の結果とcitizen_id
の更新 新しい値で。
MySQLのSQLでは、上記は次のようになります。
UPDATE possessions AS p
INNER JOIN
(
SELECT
@r := @r * (@c = p.citizen_id AND @g = p.good_id) + 1 AS r,
p.possession_id,
@c := p.citizen_id AS citizen_id,
@g := p.good_id AS good_id
FROM
possessions AS p
CROSS JOIN
(SELECT @r := 0, @c := 0, @g := 0) AS x
ORDER BY
p.citizen_id,
p.good_id
) AS f ON p.possession_id = f.possession_id
INNER JOIN
possession_updates AS u ON u.citizen_id = f.citizen_id AND u.good_id = f.good_id
SET
p.citizen_id = u.new_citizen_id
WHERE
f.r <= u.row_count
;
possessions_update
パラメータ値を含むテーブルです。
クエリは、変数を使用する既知の行番号付け方法を使用します。これは、f
に実装されています。 サブクエリ。
私はMySQLを持っていないので、パフォーマンスの観点からこれを適切にテストすることはできませんが、少なくともこのSQLFiddleデモ
メソッドが機能すること。 (SQL FiddleではMySQLの右側のスクリプトでデータ変更ステートメントが許可されていないため、UPDATEステートメントはスキーマスクリプトに含まれています。右側では、possessions
のUPDATE後の内容が返されるだけです。 。)