自動インクリメント列 (レコードが入力された順序を追跡するため) と、最後に挿入されたレコードに対して 1 に設定された "CURRENT_FLAG" を持つことによってバージョン管理されたテーブルがあります。このテーブルを結合するビューは常に CURRENT_FLAG=1 を使用するため、最後のレコードのみが返されます。
したがって、構造が次のような場合:
AUTO_ID PERSON_ID PERSON_VALUE CURRENT_FLAG
1 1 5452 0
2 1 637 1
3 2 4523 1
次にレコードを挿入するときは、CURRENT_FLAG を更新する必要があります。今、私は次のようなものを実行します:
UPDATE T
LEFT JOIN (
SELECT PERSON_ID, MAX(AUTO_ID) as AUTO_ID
FROM T
GROUP BY PERSON_ID
) as T1 ON T.PERSON_ID = T1.PERSON_ID and T.AUTO_ID = T1.AUTO_ID
SET T.CURRENT_FLAG = COALESCE(T.PERSON_ID / T.PERSON_ID, 0)
ただし、このクエリは、PERSON_ID と AUTO_ID の両方にインデックスがある場合でも、かなり小さなテーブルで数秒かかります。
レコードはステージング テーブルからバッチとして挿入され、一度に 1 人ずつ挿入されるわけではないため、auto_ids を取得して手動でフラグを設定したり、すべての current_flags を 0 に設定したりすることはできません。
そのクエリを作成する、またはトリガーやその他のソリューションを使用して同じことを行うより良い方法はありますか? MySQL 5.0+。