2

假设我有一车杂货,每件商品都有一个唯一的 ID。当有人点击“购买”时,会发送一个数组,其中包含该购物车中每个项目的对象。购物车各不相同,因此有时可能是 2 件,有时是 6 件,等等。

例子:

[{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。

多谢你们!仍然是一个菜鸟,所以我很难解释我需要什么。

4

3 回答 3

1

PostgreSQL 有一个出色的特性 UPDATE ... 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

于 2017-07-02T20:41:14.203 回答
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;";
}
于 2017-07-02T20:07:27.000 回答
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 多行更新

链接:

于 2017-07-03T00:08:28.740 回答