2017-03-07 1 views
0

Hier sind meine zwei Tabellen sold_items und categories. :Verwenden Sie UPDATE, um Spalte der zweiten Tabelle mit AVG-Daten zu füllen

sold_items:

enter image description here

Kategorien:

enter image description here

sold_items verwendet id_Categories aus der categories Tabelle als Fremdschlüssel.

ich diesen Befehl bin mit dem average_price eines Artikels in es basiert, um zu versuchen und zu füllen ist „idCategories“ gegeben - also entweder 1 oder 2. Ich verwende diesen Befehl, um den Durchschnittspreis der Einzelteile mit einem idCategories zu berechnen Klassifizierung von 2:

UPDATE categories SET average_price = (SELECT AVG(price) FROM sold_items) WHERE idCategories='2' 

Dieser Befehl erfolgreich ohne Fehler ausgeführt wird, sondern als der Durchschnittspreis der beiden Elemente Berechnung, wo idCategories = 2 sind es durchschnittlich alle Produkte Preise und den Wert von 638.00 in die Einsätze categories Tabelle so sieht es like this aus:

enter image description here

Der Wert der 999,50 erfolgt die Berechnung wäre richtig (i.e.1000 + 999/2). Was ist falsch an meinem SQL-Befehl?

Vielen Dank im Voraus

+2

Sie angeben müssen, wo idCategories = 2, innerhalb der Sub-Abfrage sowie (SELECT AVG (Preis) FROM sold_items WHERE idCategories = 2) – VDK

Antwort

1

ich eine korrelierte Unterabfrage empfehlen würde:

UPDATE categories c 
    SET average_price = (SELECT AVG(si.price) 
         FROM sold_items si 
         WHERE si.iDCategories = c.idCategories 
         ) 
    WHERE idCategories = 2; 

Dies macht Es ist viel einfacher, mehrere Kategorien gleichzeitig zu aktualisieren - oder sogar alle.

Hinweis: Wenn Ihre IDs numerisch sind (was Ihrer Ansicht nach zu sein scheint), verwenden Sie keine einfachen Anführungszeichen für Vergleiche.

+0

Schön! Auch ich würde diese Option vorschlagen. – VDK

+0

HI Gordon, du hast erwähnt, ich kann alle Kategorien auf einmal aktualisieren, was würde ich ändern, um dies zu tun? Cheers EDIT - kannst du auch die 'c' und' si' Bits erklären? Ich habe noch nie zuvor diese gesehen – neilH

+0

@ bms9nmh. . . Das sind Tabellenaliase. Sie werden im Allgemeinen empfohlen und sehr dringend empfohlen, wenn eine Abfrage auf mehr als eine Tabelle verweist. Um alle Kategorien zu aktualisieren, entfernen Sie einfach die 'Where'-Klausel. –

0

Sie angeben müssen, wo idCategories = 2, innerhalb der Sub-Abfrage auch:

UPDATE categories 
SET average_price = (SELECT AVG(price) FROM sold_items WHERE idCategories='2') 
WHERE idCategories=2 
0

Versuchen Sie folgendes:

CREATE TABLE sold_items (
    idsold_items INT, 
    item_number VARCHAR(7), 
    title VARCHAR(14), 
    URL VARCHAR(3), 
    price INT, 
    idCategories INT 
) 

CREATE TABLE categories (
    idCategories INT, 
    model VARCHAR(7), 
    averageprice FLOAT(10,2), 
    keyword VARCHAR(1) 
) 

INSERT INTO sold_items 
VALUES ('1', '14545', 'Equitek CAD', '...', '99', '1'), 
     ('2', '454545', 'Equitek', '...', '454', '1'), 
     ('3', '456645', 'Samsung', NULL, '999', '2'), 
     ('4', '5456464', 'Samsung Galaxy', '', '1000', '2') 

INSERT INTO categories 
VALUES ('1', 'Equitek', NULL, ''), 
     ('2', 'Samsung', NULL, NULL) 

UPDATE categories 
SET averageprice = CalculatedAverage.averagePrice 
FROM categories 
JOIN (
    SELECT 
     idCategories, 
     [averagePrice] = AVG(price) 
    FROM sold_items 
    GROUP BY idCategories 
) CalculatedAverage ON categories.idCategories = CalculatedAverage.idCategories 

Ergebnisse:

idCategories  model averageprice keyword 
1    Equitek 276.00 
2    Samsung 999.00   NULL 
+0

CREATE TABLE existiert auch in MySQL. Können Sie mir sagen, welches Bit der Syntax falsch ist? –

Verwandte Themen