2016-10-24 20 views
0

データベーステーブルには、フラグ( "1" - "0" - 動作していない)とその他のフィールドがあり、同時に/中にあるマシンのさまざまな特性を記述します。条件変更(フラグ変更)に対応する "行"のみを抽出する必要があります。つまり、フラグが最初に "1"(その後、 "1"を含む他のエントリが存在しますが、これにはありません最初のもの)、それが "0"に変化する行(その後に "0"を含む複数のエントリがあるかもしれません)、 "1"に再び変化する行などです。 1つのレコード(つまり、変数S - フラグが "1"に変わったときのこの変数の値とフラグが "0"に変わったときの値)。SQL/MySQLクエリ(フラグ変更を検索)?

+2

サンプルデータを表示できますか? –

+0

最初にどのような順序で?日付フィールドはありますか? – Barmar

+0

リクエストされた結果の例を追加してください –

答えて

0

change_handledという別の列を作成します。トリガーを作成して、フラグの値が変更されたら、change_handled=0と設定します。

CREATE TRIGGER detect_flag_change BEFORE UPDATE ON my_table 
FOR EACH ROW 
SET NEW.change_handled = (OLD.change_handled AND (NEW.flag = OLD.flag)); 
NEW.flag=OLD.flag

条件フラグが更新の一部として変更された場合、値が異なることになるので、等式が偽であることを意味します。次に、change_handledはfalseに設定されます。

OLD.change_handled AND ...条件は、行が処理されない場合は、change_handledがfalseになるため、フラグを変更せずに行に次のUPDATEが適用されてもfalseのままになります。

この列があると、change_handledは、偽(0)の行を検索できます。

次に、変更された行で何かをするワーカーアプリケーションがあると思います。そのアプリケーションは、UPDATEを使用してchange_handled=trueを設定して、トランザクション内の行をロックする必要があります。しかし、労働者が作業を終えるまで、その取引をコミットしないでください。そうすれば、作業者が中断された場合、更新がロールバックされ、他の誰かがその世話をすることができます。