Hallo Tim,
meine Testtabelle sieht jetzt so aus. Bitte unbedingt beachten. Ich verwende hier nur VARCHAR(2) anstatt TEXT Datentypen. Dies ist vollkommen ausreichend und spart jede Menge Platz und Probleme. TEXT ist für sehr lange Texte gedacht und nicht für normale Stringfelder. VARCHAR kann max. ca. 65000 Zeichen speichern. Wichtig!
CREATE TABLE gesamtbetrag (
id INT NOT NULL,
betrag DEC(6,2),
schalter1 VARCHAR(2),
schalter2 VARCHAR(2),
schalter3 VARCHAR(2),
PRIMARY KEY (id)
);
INSERT INTO gesamtbetrag VALUES
( 1, 100, 'on', 'on', 'on' ),
( 2, 200, ' ' , 'on', ' ');
mysql> select * from gesamtbetrag;
+----+--------+-----------+-----------+-----------+
| id | betrag | schalter1 | schalter2 | schalter3 |
+----+--------+-----------+-----------+-----------+
| 1 | 100.00 | on | on | on |
| 2 | 200.00 | | on | |
+----+--------+-----------+-----------+-----------+
2 rows in set (0.00 sec)
mysql>
So geht es leider nicht, wegen einer Einschränkung von MySQL.
mysql> UPDATE gesamtbetrag
-> SET betrag = betrag + ( SELECT CASE
-> WHEN schalter1 = 'on' THEN 11
-> ELSE 0
-> END
-> FROM gesamtbetrag
-> WHERE id = 1)
-> + ( SELECT CASE
-> WHEN schalter2 = 'on' THEN 22
-> ELSE 0
-> END
-> FROM gesamtbetrag
-> WHERE id = 1)
-> + ( SELECT CASE
-> WHEN schalter3 = 'on' THEN 33
-> ELSE 0
-> END
-> FROM gesamtbetrag
-> WHERE id = 1)
->
-> WHERE id = 1;
ERROR 1093 (HY000): You can't specify target table 'gesamtbetrag' for update in
FROM clause
mysql>'
Dehalb bedarf es hier eines Tricks ..
/* Schalter-UPDATE auf ID=1 */
UPDATE gesamtbetrag
SET betrag = betrag + (SELECT SUM(anzahl) FROM
( SELECT CASE
WHEN schalter1 = 'on' THEN 11
ELSE 0
END AS anzahl
FROM gesamtbetrag
WHERE id = 1
UNION ALL
SELECT CASE
WHEN schalter2 = 'on' THEN 22
ELSE 0
END AS anzahl
FROM gesamtbetrag
WHERE id = 1
UNION ALL
SELECT CASE
WHEN schalter3 = 'on' THEN 33
ELSE 0
END AS anzahl
FROM gesamtbetrag
WHERE id = 1
) summe_schalter
)
WHERE id = 1;
mysql> select * from gesamtbetrag;
+----+--------+-----------+-----------+-----------+
| id | betrag | schalter1 | schalter2 | schalter3 |
+----+--------+-----------+-----------+-----------+
| 1 | 166.00 | on | on | on |
| 2 | 200.00 | | on | |
+----+--------+-----------+-----------+-----------+
2 rows in set (0.00 sec)
mysql>
/* Schalter-UPDATE auf ID=2 */
UPDATE gesamtbetrag
SET betrag = betrag + (SELECT SUM(anzahl) FROM
( SELECT CASE
WHEN schalter1 = 'on' THEN 11
ELSE 0
END AS anzahl
FROM gesamtbetrag
WHERE id = 2
UNION ALL
SELECT CASE
WHEN schalter2 = 'on' THEN 22
ELSE 0
END AS anzahl
FROM gesamtbetrag
WHERE id = 2
UNION ALL
SELECT CASE
WHEN schalter3 = 'on' THEN 33
ELSE 0
END AS anzahl
FROM gesamtbetrag
WHERE id = 2
) summe_schalter
)
WHERE id = 2;
mysql> select * from gesamtbetrag;
+----+--------+-----------+-----------+-----------+
| id | betrag | schalter1 | schalter2 | schalter3 |
+----+--------+-----------+-----------+-----------+
| 1 | 166.00 | on | on | on |
| 2 | 222.00 | | on | |
+----+--------+-----------+-----------+-----------+
2 rows in set (0.00 sec)
mysql>
Der UPDATE ist jetzt schon etwas komplex. Der Grund hierfür ist auch das suboptimale Datenmodel bzw. Formularkonzept. Wenn so ein UPDATE zweimal läuft, wird auch zweimal aufaddiert. Wie gesagt kein stabiles Programmkonzept meiner Meinung nach.
Grüße
Thomas