2009-07-02 6 views
1

大量のデータを更新するSQL文を作成しようとしています。MySQLのマージ量は2行です

は私が持っていることは同じTRANSIDを持つ2つの行は、私はそのTRANSIDとの最初の1の合計の列に結果を入れて、それらを合計し、第二を配置する必要がありますあります

id, transid, amount, narative1, narative 2, total, active 
1  1234  23.2  NULL  NULL  NULL  1 
2  1234  120.33  NULL  NULL  NULL  1 
3  1235  98.00  NULL  NULL  NULL  1 

のようなテーブルであります最初のインスタンスのnaritive2の量と2番目のインスタンスを非アクティブにする。これは、transidのための単一の行を無視する必要があります。

私が何をしたいの結果は次のようになります。

id, transid, amount, narative1, narative 2, total,  active 
1  1234  23.2  NULL  120.33  143.53  1  
2  1234  120.33  NULL  NULL  NULL  0 
3  1235  98.00  NULL  NULL  NULL  1 

私はひもツイスターのビットを知っているが...

理想的には私はちょうどMySQLの文でこれを実行したいのですが。だから私は複数のSQLステートメントを実行する必要はありませんが、私はPHPなどに接続することを避けたいです。その非常に大きなデータセットです。

+0

正確に更新されるものは何ですか?あなたの例ではわずかな値しか変更されていません。更新したい値はどこから取ってくるのですか?あなたは手でこれをしたいですか?すべてのエントリ/値を手作業でSQL文を書くのと同じですか? – markus

+0

行1と2からの金額が合計されます。 23.2 + 120.33 = 143.53 となり、合計が第1行に入れられる。 2番目の行が非アクティブ化されます。 –

答えて

3

これにより、正確に2行(1ではなく、3以上)のトランザクションのみが更新されます。

UPDATE mytable mtu 
JOIN (
     SELECT minid, maxid, mtmin.amount AS minamt, mtmax.amount AS maxamt 
     FROM (
       SELECT MIN(id) AS minid, MAX(id) AS maxid 
       FROM mytable mti 
       GROUP BY 
         transid 
       HAVING COUNT(*) = 2 
       ) mt 
     JOIN mytable mtmin 
     ON  mtmin.id = minid 
     JOIN mytable mtmax 
     ON  mtmax.id = maxid 
     ) mts 
ON  id IN (minid, maxid) 
SET  narative2 = CASE id WHEN minid THEN minamt ELSE NULL END, 
     total = CASE id WHEN minid THEN minamt + maxamt ELSE NULL END, 
     active = (id = minid) 
+0

うわー、あなたはこのものをうまく使っています。それを行って、どうやって行くのか見てみましょう。 –

+0

は完璧に機能しました。ありがとう! –

関連する問題