2017-07-02 10 views
2

Lassen Sie uns sagen, ich habe einen Einkaufswagen mit Lebensmitteln und jeder Artikel hat eine eindeutige ID. Wenn jemand auf "Kauf" klickt, wird ein Array mit einem Objekt für jeden Artikel in diesem Einkaufswagen gesendet. Der Wagen ändert sich so manchmal ist es vielleicht 2 Artikel und manchmal 6 Artikel usw.Führen Sie PostgreSQL UPDATE Abfrage für jedes Objekt in Array

Beispiel:

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

ich meine SQL-Tabelle benötigen, „Lebensmitteleinzelteile verfügbar“, zu aktualisieren, je nachdem, was gekauft wurde.

Für einen Lebensmittelpunkt möchte ich folgendes verwenden:

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

Da ich jetzt mehrere Elemente haben, wie kann ich die Abfrage für jedes Element ausgeführt werden, die gekauft wurde? Oder als eine massive Abfrage, die sich daran anpasst, wie viele Artikel gekauft wurden?

Mein Projekt ist Ionic/AngularJs und NodeJs, Express, MassiveJs.

Danke Jungs! Immer noch ein Noob, so dass es mir schwer fällt zu erklären, was ich brauche.

+0

Sie zeigen eine Objektstruktur, und dann eine andere Update-Struktur, so weit wie die Feldnamen. Wenn Sie eine brauchbare Antwort erhalten möchten, sollten Sie diese beiden in Ihrer Frage zusammenbringen. Andernfalls ist die Logik Ihrer Aktualisierungsabfrage unklar. –

Antwort

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

könnten Sie einfach verwenden für Schleife solche Abfrage zu erstellen

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

Das war genau was ich brauchte! Ich musste ein paar Änderungen vornehmen, zum Beispiel ein "else" hinzufügen, so dass die anderen Elemente in der Tabelle nicht betroffen sind. Danke für die Hilfe – Cesar

0

PostgreSQL hat eine excellent featureUPDATE ... FROM ...;, die eine bequeme Möglichkeit gibt eine Tabelle auf einen anderen Tisch zu aktualisieren. Und zweitens herausragendes Merkmal - können Sie eine pseudo-Tabelle VALUES in dieser Abfrage verwenden:

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; 

hier ein SQLFiddle ist eine Idee zu überprüfen - http://sqlfiddle.com/#!17/04f24/22

0

Wenn Sie mit Massive.js 3.0, das heißt, Sie haben Zugriff auf den zugrunde liegenden Treiber pg-promise.

Leider benutze ich Massive.js nicht persönlich, deshalb weiß ich nicht genug über Aktualisierungen direkt durch sie. Ich kann Ihnen nur als Autor von pg-promise raten, dass Sie auf seinen Treiber zugreifen können, um das gewünschte Update zu machen, wie unten gezeigt.

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 
    }); 

Siehe auch: pg-promise multi-row update.

Links:

Verwandte Themen