2017-07-02 64 views
2

比方说,我有一个杂货店的购物车,每个物品都有一个唯一的ID。当有人点击“购买”时,会为该购物车中的每件商品发送一个数组,并附带一个对象。推车变化所以有时候它可能是2项,有时6项等对阵列中的每个对象运行PostgreSQL UPDATE查询

例子:

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

我需要我的SQL表“可杂货”,根据什么购买更新。

对于一个食品项目,我会用以下内容:

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

因为我现在有多个项目,我怎么能得到查询,为所购买的每一项运行?或者作为一个可根据购买多少物品进行调整的大规模查询?

我的项目是Ionic/AngularJs和NodeJs,Express,MassiveJs。

谢谢你们!还是一个小菜,所以我很难解释我需要什么。

+0

你给一个对象结构,然后不同的更新结构,尽可能的字段名。如果你想得到一个可用的答案,你应该在你的问题中做出这两个匹配。否则,更新查询的逻辑不清楚。 –

回答

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

你可以使用简单的for循环建立这样的查询

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检查一个想法 - http://sqlfiddle.com/#!17/04f24/22

0

如果使用Massive.js 3.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

链接: