2017-07-02 13 views
2

私は食料雑貨品のカートを持っており、各項目に一意のIDがあるとします。誰かが「購入」をクリックすると、そのカート内の各アイテムのオブジェクトを含む配列が送信されます。カートは時にはそれが2つの項目、時には6項目、あるかもしれないので、変わるなど配列内のすべてのオブジェクトのPostgreSQL UPDATEクエリを実行します

例:

[{id: 1, amt_purchased: 3}, {id: 2, amt_purchased: 4}] 

私が購入したものに応じて更新するように、私のSQLテーブル、「利用できる食料品」が必要。 1つの食料品の項目については

、私は以下を使用します。

UPDATE available 
SET amt_avail = amt_avail - 3 
WHERE produce_id = 1 

私は今、複数のアイテムを持っているので、どのように私は、クエリが購入したアイテムごとに実行するために得ることができますか?または、購入されたアイテムの数に応じて適応する1つの大規模なクエリですか?

私のプロジェクトは、Ionic/AngularJsとNodeJs、Express、MassiveJsです。

ありがとうございました!それでも私は必要なことを説明するのに苦労しています。

+0

あなたは一つのオブジェクトの構造、そしてその後、別の更新構造、限り、フィールド名が表示されます。あなたが使える答えを得たいのであれば、それらの2つをあなたの質問に一致させるべきです。それ以外の場合は、更新クエリのロジックが不明です。 –

答えて

0
update available 
    set amt_avail = case 
     when produce_id = 1 then amt_avail - 3 
     when produce_id = 2 then amt_avail - 4 
end; 

あなたは

var items = [{id: 1, amt_purchased: 3}, {id: 2, amt_purchased: 4}]; 

function buildQuery(items) { 
    var query = "update available set amt_avail = case "; 
    for (var i = 0; i < items.length; i++) { 
     var item = items[i]; 
     query += `when produce_id = ${item['id']} then amt_avail - ${item['amt_purchased']}` 
    } 
    return query += " end;"; 

}

+0

これはまさに私が必要としていたものでした!たとえば、テーブルの他の項目が影響を受けないように「else」を追加するなど、いくつかの調整が必要でした。助けてくれてありがとう – Cesar

0

、このようなクエリを構築するために、PostgreSQLが別のテーブルの上に一つのテーブルを更新するための便利な方法を提供しますexcellent featureUPDATE ... FROM ...;を持ってループするための簡単な使用することができます。そして第二に優れた機能 - あなたはこのクエリで擬似テーブルVALUESを使用することができます。

UPDATE available a 
SET amt_available = a.amt_available + v.amt_available 
FROM (
    VALUES (1, 25), (3, 15), (7, -55) -- just pass required values 
) AS v (produce_id, amt_available) 
WHERE a.produce_id=v.produce_id; 

はここでアイデアをチェックするSQLFiddleだ - あなたが持っている意味Massive.js 3.0を使用している場合http://sqlfiddle.com/#!17/04f24/22

0

をその基礎となるドライバpg-promiseへのアクセス。

残念ながら、私はMassive.jsを個人的に使用していないので、それを介して直接更新を行うことについては十分に分かりません。私はpg-promiseの作者としてあなたに助言することができます。そのドライバにアクセスして、下記のようなアップデートを行うことができます。

const db; // your Massive.js database object; 

const helpers = db.pgp.helpers; // pg-promise helpers namespace 

// reusable ColumnSet: 
const cs = new helpers.ColumnSet(['?id', 'amt_purchased'], {table: 'available '}); 

// your input data: 
const data = [{id: 1, amt_purchased: 3}, {id: 2, amt_purchased: 4}]; 

// query to be executed: 
const query = helpers.update(data, cs) + ' WHERE v.id = t.id'; 

db.instance.none(query) 
    .then(() => { 
     // success, updated all at once 
    }) 
    .catch(error => { 
     // error 
    }); 

も参照してください:pg-promise multi-row update

リンク:

関連する問題