MySQL Forums
Forum List  »  German

Re: Anfängerfrage mehrere Bedingungen
Posted by: Thomas Wiedmann
Date: January 25, 2012 04:20AM

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

Options: ReplyQuote


Subject
Views
Written By
Posted
2494
January 23, 2012 07:39AM
1116
January 23, 2012 08:45AM
1287
January 23, 2012 01:42PM
1313
January 24, 2012 05:54AM
1051
January 25, 2012 01:32AM
Re: Anfängerfrage mehrere Bedingungen
1970
January 25, 2012 04:20AM
1164
January 25, 2012 06:40AM
1158
January 26, 2012 10:06AM
1168
January 29, 2012 06:35AM
1233
January 23, 2012 08:30AM


Sorry, you can't reply to this topic. It has been closed.

Content reproduced on this site is the property of the respective copyright holders. It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.