2016-12-01 3 views
0

Die SGBD ist MySQL. Ich habe eine Tabelle mit einem eindeutigen Index für die Spalte A. Auf Duplikat ich diese Regel anwenden möchten:mysql auf doppelte Verwendung nicht vorhandene Spalte

nb_occurence = nb_occurence + 1, 
average_amount = IF(average_amount IS NULL, VALUES(amount), 
    (average_amount * nb_occurence + VALUES(amount))/(nb_occurence + 1) 
), 
min_amount = IF(VALUES(amount) < min_amount, VALUES(amount), min_amount), 
max_amount = IF(VALUES(amount) > max_amount, VALUES(amount), max_amount) 

Das Problem? amount ist keine vorhandene Spalte. Die Daten, die ich einfüge: Ich habe eine sehr große Menge von Daten mit viel Kollision auf der Spalte A (UNIQUE INDEX). Ich füge sie alle in die Tabelle ein und überlasse MySQL die Berechnungen. In diesem Datensatz enthält jede Zeile eine Spalte amount. Ich möchte, dass MySQL amount relative Spalten selbst aktualisiert und dabei die Daten verwendet, die ich einfügen möchte.

Ich versuchte dies:

INSERT INTO `myTable`(`A`, `amount`) VALUES('foobar', 5) 

ON DUPLICATE KEY UPDATE 
     nb_occurence = nb_occurence + 1, 
     average_amount = IF(average_amount IS NULL, VALUES(amount), 
      (average_amount * nb_occurence + VALUES(amount))/(nb_occurence + 1) 
     ), 
     min_amount = IF(VALUES(amount) < min_amount, VALUES(amount), min_amount), 
     max_amount = IF(VALUES(amount) > max_amount, VALUES(amount), max_amount) 

Und es sagt mir: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'amount' in 'field list'.

Ich versuchte ein Doppelzitat um das Feld, wie wenn Sie eine bare SELECT "toto"; aber SQL-Syntaxfehler.

Ich wette, es gibt eine Möglichkeit, das in SQL richtig zu tun!

Natürlich konnte ich die Tabelle verändern und eine nutzlose amount Spalte hinzufügen, aber ich hoffe, dass es einen besseren Weg ist :)

EDIT: create table-Anweisung:

CREATE TABLE myTable 
(
    A VARCHAR(32) PRIMARY KEY NOT NULL, 
    nb_occurence INT(11) NOT NULL, 
    average_amount INT(11) NOT NULL, 
    min_amount INT(11) NOT NULL, 
    max_amount INT(11) NOT NULL 
); 

Antwort

1

Try this:

INSERT INTO myTable (A, average_amount) VALUES('foobar', 5) 
ON DUPLICATE KEY UPDATE 
    nb_occurence = nb_occurence + 1, 
    average_amount = IF(average_amount IS NULL, VALUES(average_amount), 
     (average_amount * nb_occurence + VALUES(average_amount))/(nb_occurence + 1)), 
    min_amount = IF(VALUES(average_amount) < min_amount, VALUES(average_amount), min_amount), 
    max_amount = IF(VALUES(average_amount) > max_amount, VALUES(average_amount), max_amount) 

Das Problem ist in Ihrer ersten Zeile, wenn Sie die Spalten auflisten, die Sie einfügen möchten. Sie referenzieren "Betrag", was bedeutet, dass Sie in den Spaltenbetrag einfügen möchten, diese Spalte jedoch nicht in der myTable-Tabelle vorhanden ist. So natürlich bekommst du den Fehler gesehen.

+0

Sie haben Recht, lügen Sie einfach über den Feldnamen :) – JesusTheHun

Verwandte Themen