If Anweisung in UPDATE Mysql
Simone
- datenbank
HI,
Bitte helft mir auf die Sprünge ;o)
Es gibt eine Tabelle "test_it"
Updatewerte:
$insertkey ="b";
$neuanzahl ="3";
Spaltenanzahl = 3
id | key1 | anz
Spalten Inhalt
id=1
key1 = "a,b,c"
anz = "2"
Jetzt möchte ich beim Update prüfen ob in der Spalte key1 schon mein $insertkey (b) vorhanden ist. Nur wenn er nicht vorhanden ist diese Spalte updaten die andere Spalte soll davon unberührt sein.
Also prüfe ob $insertkey (b) in key1 (a,b,c) wenn ja dann update key1
gleichzeitig update mir jedoch immer Spalte anz (anz+2)
Wie kann ich diese UPDATE Funktion formulieren?
Danke
Simone
hi,
Spaltenanzahl = 3
id | key1 | anzSpalten Inhalt
id=1
key1 = "a,b,c"
Sieht so aus, als ob du nicht vernünftig normalisiert hättest - überdenke dein Datenmodell.
Also prüfe ob $insertkey (b) in key1 (a,b,c) wenn ja dann update key1
gleichzeitig update mir jedoch immer Spalte anz (anz+2)Wie kann ich diese UPDATE Funktion formulieren?
Mit IF(), wie du schon selber schriebst.
Hast du das mal im Manual deines Datenbanksystems nachgeschlagen?
gruß,
wahsaga
Hallo, wahsaga
Danke für Deine Antwort.
Zitat: Hast du das mal im Manual deines Datenbanksystems nachgeschlagen?
Wenn ich die Lösung hätte würde ich mir nicht erlauben hier im Hilfe Forum eine Frage zu stellen . ;o)
Dennoch hilft mir Deine oberflächliche Anwort nicht weiter.
Ich bitte Dich etwas deutlicher zu werden.
Das habe ich versucht:
Updatewerte:
$insertkey ="b";
$neuanzahl ="3";
Spaltenanzahl = 3
id | key1 | anz
Spalten Inhalt
id=1
key1 = "a,b,c"
anz = "2"
UPDATE test\_it
SET
anz = '(files + ".$neuanzahl.")',
IF(FIND_IN_SET('$endung', key1) > 0, key1 = CONCAT_WS(',',key1,'".$insertkey."'))
WHERE id =1
Simone
UPDATE
test\_it
SET
anz = '(files + ".$neuanzahl.")',
IF(FIND_IN_SET('$endung', key1) > 0, key1 = CONCAT_WS(',',key1,'".$insertkey."'))
WHERE id =1
Das mit dem IF ist falsch. Einmal ist die Syntax anders als in einer normalen Programmiersprache IF( Bedingung, ergebniss_wenn_wahr, ergebniss_wenn_falsch) ausserdem solltest du das ganze mit einer einfach where Bedingung (was wohl eher einer if Anweisung entspricht) erfüllen können.
Schematisch so:
UPDATE .......
WHERE FIND_IN_SET(wert, feld) > 0 AND ID = .....
Struppi.
Hallo Struppi
Danke für Deine Antwort!
UPDATE .......
WHERE FIND_IN_SET(wert, feld) > 0 AND ID = .....
So hatte ich es auch schon probiert das geht natürlich
Zu mein Problem:
Ich möchte beim Update prüfen ob in der Spalte key1 schon mein $insertkey (b) vorhanden ist. Nur wenn er nicht vorhanden ist diese Spalte updaten
die anderen Spalten (updates) soll davon unberührt sein.
was mit dieser Abfrage nicht durchführbar scheint
WHERE FIND_IN_SET(wert, feld)
Simone
hi,
Zitat: Hast du das mal im Manual deines Datenbanksystems nachgeschlagen?
Wenn ich die Lösung hätte würde ich mir nicht erlauben hier im Hilfe Forum eine Frage zu stellen . ;o)
Das war keine Antwort auf meine Frage.
Dennoch hilft mir Deine oberflächliche Anwort nicht weiter.
Deine "oberflächliche" Art, eine Problemlösung zu suchen, hilft auch nicht weiter.
Ich bitte Dich etwas deutlicher zu werden.
Also gut:
Liebe Simone,
hast du, da du ja IF() in einer MySQL-Query zu verwenden gedenkst, dir im Manual schon mal angesehen, wie die Syntax dieser Anweisung in MySQL aussieht.
Falls ja, was hast du herausgefunden?; Falls Nein, dann sei doch bitte so lieb, dies jetzt nachzuholen.
Das habe ich versucht:
Und was kam dabei heraus?
(Sag jetzt bitte nicht "funk´tioniert nicht".)
gruß,
wahsaga
hi,
Sag jetzt bitte nicht "funk´tioniert nicht..
Doch, es funktioniert
Durch die Hilfe von Menschen die helfen und sich nicht über die Unwissenheit anderer belustigen PUNKT
Simone
Durch die Hilfe von Menschen die helfen und sich nicht über die Unwissenheit anderer belustigen PUNKT
Du hast nicht verstanden worum es bei SELFhtml und eben auch im Forum geht. Keiner macht sich Lustig über jemanden, sondern dir wurde mehrfach versucht zu helfen, in dem dir gesagt wird, wo du das Nachlesen kannst was dir hilft.
Das nächste Problem ist sicher nicht weit und es ist doch sicher auch für dich befriedigender selbst das Problem zu lösen, als jedesmal anderen erst das Problem begreiflich machen zu müssen, um zu hoffen das jemand sich, mit einer für dich funktionierenden Lösung, erbarmt.
Also was hilft dir mehr - Mitleid, weil jemand merkt das du nicht Willens bist die Dokumentaiton zu lesen oder Hilfe zur Selbsthilfe?
Struppi.
Hallo
UPDATE
test\_it
SET
anz = '(files + ".$neuanzahl.")',
IF(FIND_IN_SET('$endung', key1) > 0, key1 = CONCAT_WS(',',key1,'".$insertkey."'))
WHERE id =1
IF führt in einer Query nichts aus, sondern liefert etwas zurück.
IF(1<2,'yes','no') liefert also "yes" zurück. http://dev.mysql.com/doc/refman/4.1/en/control-flow-functions.html
IF(FIND_IN_SET('b', key1) > 0, key1, CONCAT_WS(',',key1,'b')) liefert also entweder den key1 oder die Verkettung zurück, je nachdem, ob (FIND_IN_SET('b', key1) > 0) wahr oder falsch ist.
Nun muss man das Ergebnis von IF nur noch in den UPDATE-Query einbauen:
UPDATE test_it SET
anz = (files + 3),
key1 = IF(FIND_IN_SET('b', key1) > 0, key1, CONCAT_WS(',',key1,'b'))
WHERE id =1
viele Grüße
Axel
Hallo Axel
Ich danke Dir ganz lieb.!!
Es gibt also doch noch Menschen hier im Forum die nicht nur Sprüche ablassen können sondern durch Ihr Wissen glänzen.
Danke Simone
Nun muss man das Ergebnis von IF nur noch in den UPDATE-Query einbauen:
UPDATE test_it SET
anz = (files + 3),
key1 = IF(FIND_IN_SET('b', key1) > 0, key1, CONCAT_WS(',',key1,'b'))
WHERE id =1
Spricht eigentlich was dagegen, einfach in allen Datensätzen das Feld zu updaten?
Das spart das if statement.
UPDATE test_it SET
anz = (files + 3),
key1 = CONCAT_WS(',',key1,'b')
WHERE id =1
oder erzeugt das einen Fehler, wenn das Bit schon gesetzt ist?
Struppi.
Hallo,
UPDATE test_it SET
anz = (files + 3),
key1 = IF(FIND_IN_SET('b', key1) > 0, key1, CONCAT_WS(',',key1,'b'))
WHERE id =1Spricht eigentlich was dagegen, einfach in allen Datensätzen das Feld zu updaten?
Das spart das if statement.
UPDATE test_it SET
anz = (files + 3),
key1 = CONCAT_WS(',',key1,'b')
WHERE id =1
Nein, das würde ja bei
id key1 anz
1 a,b 1
dann
id key1 anz
1 a,b,b 4
ergeben. (btw.: die Spalte files habe ich gedanklich mit der Spalte anz gleichgesetzt, weil ich sonst nicht wüsste, wo sie plötzlich herkommt.)
Wenn ich es richtig verstanden habe, wollte sie folgendes erreichen:
id key1 anz
1 a 1
UPDATE test\_it SET
anz = (anz + 3),
key1 = IF(FIND\_IN\_SET('b', key1) > 0, key1, CONCAT\_WS(',',key1,'b'))
WHERE id =1
ergibt
id key1 anz
1 a,b 4
UPDATE test\_it SET
anz = (anz + 3),
key1 = IF(FIND\_IN\_SET('b', key1) > 0, key1, CONCAT\_WS(',',key1,'b'))
WHERE id =1
ergibt
id key1 anz
1 a,b 7
also: Die Spalte anz wird immer geupdatet, die Spalte key1 aber nur dann, wenn der entsprechende Buchstabe nicht schon in der Liste steht.
viele Grüße
Axel
Nein, das würde ja bei
id key1 anz
1 a,b 1dann
id key1 anz
1 a,b,b 4ergeben. (btw.: die Spalte files habe ich gedanklich mit der Spalte anz gleichgesetzt, weil ich sonst nicht wüsste, wo sie plötzlich herkommt.)
Das stimmt nicht. Das Set Feld, kann einen Wert immer nur einmal haben.
Vorhin hatte ich keine Möglichkeit das zu testen, mein Vorschlag geht ohne Probleme.
CREATE TABLE `tipps` (
`test` set('0','1','-1') NOT NULL default ''
) ;
--
-- Daten für Tabelle `tipps`
--
INSERT INTO `tipps` VALUES ('0,-1');
INSERT INTO `tipps` VALUES ('0,-1');
INSERT INTO `tipps` VALUES ('0,1,-1');
INSERT INTO `tipps` VALUES ('-1');
INSERT INTO `tipps` VALUES ('1,-1');
INSERT INTO `tipps` VALUES ('0,-1');
INSERT INTO `tipps` VALUES ('1,-1');
INSERT INTO `tipps` VALUES ('-1');
und dann
UPDATE tipps SET test = CONCAT_WS(',', test, '-1') WHERE 1
Macht genau das richtige.
also: Die Spalte anz wird immer geupdatet, die Spalte key1 aber nur dann, wenn der entsprechende Buchstabe nicht schon in der Liste steht.
Das stimmt ja, aber das IF ist überflüssig ob es die Abfrage wirklich langsamer macht habe ich jetzt nicht getestet.
Struppi.
--
Javascript ist toll
Hallo,
mein Vorschlag geht ohne Probleme.
CREATE TABLE
tipps
(
test
set('0','1','-1') NOT NULL default ''
) ;
Ja, unter der Voraussetzung, key1 würde vom Datentyp SET sein, würde Dein Vorschlag funktionieren ;-).
viele Grüße
Axel
mein Vorschlag geht ohne Probleme.
CREATE TABLE
tipps
(
test
set('0','1','-1') NOT NULL default ''
) ;Ja, unter der Voraussetzung, key1 würde vom Datentyp SET sein, würde Dein Vorschlag funktionieren ;-).
Funktioniert find_in_set auch auf andere Felder?
Struppi.
echo $begrüßung;
Funktioniert find_in_set auch auf andere Felder?
echo "$verabschiedung $name";
Hello,
Funktioniert find_in_set auch auf andere Felder?
Das ist eine "ganz normale spezielle Stringfunktion" *g*
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello Struppi,
Dein Posting bring meine ganze benutzerdefinierte Anzeige durcheinander.
Da sind die nachfolgenden Threads plötzlich alle als gelesen markiert, obwohl ich sie noch gar nicht gelesen habe. Wenn ich dann auf das Nachfolgeposting gehe, ist alles wieder OK
Was hast Du da eingebaut?
Muss aber dann wohl ein Fehler des Forums sein, oder?
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Dein Posting bring meine ganze benutzerdefinierte Anzeige durcheinander.
Da sind die nachfolgenden Threads plötzlich alle als gelesen markiert, obwohl ich sie noch gar nicht gelesen habe. Wenn ich dann auf das Nachfolgeposting gehe, ist alles wieder OKWas hast Du da eingebaut?
Ich? Gar nichts!
Muss aber dann wohl ein Fehler des Forums sein, oder?
Eben, frag hier einen Admin.
Struppi.
hi,
Was hast Du da eingebaut?
Im SQL-Code stand mehrmals die Sequenz für den Beginn der Signatur.
(Ist doch aber langsam schon ein alter Hut ...)
gruß,
wahsaga
Was hast Du da eingebaut?
Im SQL-Code stand mehrmals die Sequenz für den Beginn der Signatur.
(Ist doch aber langsam schon ein alter Hut ...)
Zuhause mit dem Firefox hatte ich das gar nicht gesehen, das sind SQL Kommentare die phpmyadmin beim exportieren einbaut.
Hab ich noch nicht vorher hier gesehen (ich schau mir auch selten die DB Threads an).
Struppi.
yo,
die lösung für dein UPDATE-befehl wurde ja bereits gefunden. allerdings will ich noch mal auf den anderen rat von wahsaga eingehen, der ein wenig untergegangen ist, da es sich lohnt, den hinweis zu verfolgen.
dein daten-design entspricht nicht der 1. Normallform, sprich du rufst mit hilfe von mysql funktionen teile eines einzelnen tabellen-feldes auf. damit liegt deine tabelle nicht in atomarer form vor.
das ist nicht grundsätzlich falsch, aber man sollte dann auch genau wissen, welche vorteile und welche nachteile das hat. eine folge von nachteilen zum beispiel ist eben dein update befehl. der würde wesentlich einfacher ausfallen, wenn die tabellen in atomarer form vorliegen würde.
Ilja
Hello,
Bitte helft mir auf die Sprünge ;o)
Vielleicht hilft Dir dieser Thread https://forum.selfhtml.org/?t=126807&m=818034 ?
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom