2016-12-18 6 views
0

Ich habe drei Tabellen:MySQL Zusammenfassung Preis von Auftragspositionen in Tabelle orders

CREATE TABLE IF NOT EXISTS 'phones' (
    phone_id INT PRIMARY KEY, 
    name  VARCHAR(255) NOT NULL, 
    price  FLOAT  NOT NULL, 
    description TEXT 
); 

CREATE TABLE IF NOT EXISTS 'orders' (
    order_id INT PRIMARY KEY, 
    date  DATE NOT NULL , 
    summary FLOAT NOT NULL 
); 

CREATE TABLE IF NOT EXISTS 'order_items' (
    phone_id INT, 
    order_id INT, 
    quantity INT NOT NULL, 
    FOREIGN KEY (phone_id) REFERENCES phones (phone_id), 
    FOREIGN KEY (order_id) REFERENCES orders (order_id) 
); 

Wie ist es möglich summary Preis der gesamten Ordnung als eine Summe von Telefonpreise * seine Menge zu setzen: phones.price * order_items.quantity. Ist es überhaupt möglich? Oder sollte ich meinen DB-Plan in angemessener Weise ändern?

Antwort

1

Wenn Sie es für alle Datensätze tun möchten, verwenden Sie innere Verknüpfung.

+0

Yea...Missed der Spalte Name ... Edited jetzt – FallAndLearn

+0

danke für Ihre Antwort. Aber kannst du mir bitte auch sagen, ist es eine gute Übung, die Zeile so zu aktualisieren? Sollte ich dies nach jedem Einfügen in die Tabelle 'order_items' durchführen und wenn ja, wie? Oder kann ich das Feld "Zusammenfassung" entfernen und nur jedesmal die Option "AUSWÄHLEN" auswählen, wenn ich den Gesamtpreis für die Bestellung erhalten möchte? –

+0

Ja, es ist wie der letzte Weg. Es ist nicht notwendig, die update-Anweisung nach jedem Einfügen auszuführen. – FallAndLearn

0

Sie erreichen dies, indem Sie die Tabellen zusammenführen und die Bestellübersicht wie folgt aktualisieren.

Update orders o 
Inner join order_items oi On oi.order_id = o.order_id 
Inner join phones p on p.phone_id = oi.phone_id 
Set o.summary = p.prices * oi.quantity. 
+0

Wenn Sie den Aktualisierungsvorgang nicht bei jeder Bestellung durchführen möchten, fügen Sie ein. Finden Sie die Zusammenfassung nur beim Einfügen und fügen Sie sie ein. – Niru

0

Ja, Sie können es tun, aber Sie müssen die Preise in einer Unterabfrage zusammenfassen:

Update orders o left join 
     (select oi.order_id, sum(p.prices * oi.quantity) as summary 
     from order_items oi join 
      phones p 
      on p.phone_id = oi.phone_id 
     group by oi.order_id 
     ) oo 
     on oo.order_id = o.order_id 
    set o.summary = oo.summary; 

Hinweis: Die left join stellt sicher, dass alle Aufträge aktualisiert. Wenn für den Artikel keine Bestellpositionen vorhanden sind, wird summary auf NULL festgelegt. Mit einer inner join würden nicht übereinstimmende Aufträge den Wert summary nicht ändern.

+0

Soll ich diesen Befehl jedes Mal verwenden, wenn ich in 'order_items' oder' orders' Tabelle einfüge? –

+0

@VadZelenin. . . Wenn Sie möchten, dass der Wert konsistent ist, benötigen Sie einen Trigger. Ich würde Ihnen raten, einfach eine Ansicht mit der obigen Logik zu erstellen, damit die Werte nur bei Bedarf berechnet werden. –

Verwandte Themen