2017-01-13 20 views
2

私はトランザクションのデータベーステーブルを持っています。コード内にいくつかの曖昧さがあるため、同じ請求書に肯定的な取引と否定的な取引が同じ金額で行われたケースが数多くあります。 voidという名前のソフト削除列があります。私はこれを更新しようとしています。同じテーブル内の一致するレコードを更新する

基本的に私が欲しいものはこれです:

UPDATE transactions pos JOIN transactions neg on pos.invoice_id = neg.invoice_id 
AND pos.amount = neg.amount AND pos.effect = 1 AND neg.effect = -1 
AND pos.void IS NULL AND neg.void IS NULL 
SET pos.void = true, neg.void = true 

はちょうどかかわらず、であるとして、これを実行し、一意のペアを識別しません。したがって、請求書に+ X、-X、+ X、または代わりに-Y、+ Y、-Yがある場合、すべて無効になります。私はこれが一般的な問題だと思ったでしょうが、私の問題によく似た質問や答えは見られません。

サブクエリを使用するのが似通った質問のほとんどの回答ですが、2つではなく1つのエントリを更新しようとしていますが、両方のエントリを更新する方法がわかりません。

あなたのテーブル構造を投稿した場合のおかげで、 -Eric

+0

男ああ...私は、クエリを持っていました私の最後の仕事でこれに非常に似た何かをしました。それは可能ですが、現時点ではそれがどのように機能しているかを覚えていません。 – CptMisery

答えて

0

はたぶん私はより良いあなたを助けることができますが、私は、これはあなたが欲しいものだと思う:

UPDATE transactions 
SET void = true 
WHERE invoice_id in (
    SELECT invoice_id from transactions as pos 
     JOIN transactions neg 
     ON pos.invoice_id = neg.invoice_id 
     AND pos.amount = neg.amount AND pos.effect = 1 AND neg.effect = -1 
     AND pos.void IS NULL AND neg.void IS NULL 
    ) 
+0

残念ながら、これは請求書のすべての取引を無効にします。オフセットのプラスとマイナスのオフセットだけではありません。 – EpicWally

+0

私は今あなたの問題を理解している、私はそれが1つのクエリでそれを行うことはできないと思う。私はあなたのための手順を作成していますが、私はテーブルトランザクションの主キーが何であるかを知る必要があります。それを私に知らせることはできますか?または全体の構造も素晴らしいでしょう。 – tfidelis

+1

私は仕事を終え、必要に応じてテーブルを反復してエントリを更新するPHPルーチンを書いてしまったので、解決策があると思います。この時点で私はそれがたくさんのことを学ぶので、それが質問でなされるかどうか不思議です。しかし主キーは_rowidです。 – EpicWally

関連する問題