[MySQL] Where in ON DUPLICATE KEY UPDATE

whirpool

Selbstverarscher
ID: 41546
L
26 Mai 2007
30
5
Mahlzeit :eek:)
Also mir schwirrt der Kopp, die Referenz liest sich mehr und mehr wie Suaheli und ich komme nicht sorecht vom Fleck.

Folgendes Szenario;
Ein Benutzer ist in einer oder mehreren Gruppen ('GroupID').
Er will einen identifizierbaren('DataID') Datensatz('Data1',...) abpeichern.
Das Datum des Datensatzes('Datum') ist ebenfalls bekannt.

Nun.. Das ganze kann man jetzt entweder mit 'REPLACE' oder 'INSERT INTO ... ON DUPLICATE KEY UPDATE' machen und die Daten einfach reinprügeln.
Doch, ist der Datensatz('GroupID','DataID') bereits vorhanden, möchte ich vor dem (über-)schreiben prüfen ob das Datum, des Datensatzes der eingelesen werden soll, aktueller ist als der bereits vorhandene.
Damit ist 'REPLACE' natürlich gestorben und das 'ON DUPLICATE KEY UPDATE' verträgt kein 'WHERE'.

Ich habe schon mit 'IF' und 'CASE' experimentiert, bin aber leider auch nicht schlauer geworden.
Hat wer rat wie/ob man das in MySQL lösen kann?
Ein Workaround in PHP mit einer weiteren sql-query ist wohl möglich, doch habe ich mich da wohl etwas verbissen und möchte gerne wissen wie(wenn überhaupt(was mich aber wundern würde wenn nicht)) man das in MySQL lösen kann *g*


MySQL-Version: 4.1.11

Die Tabelle;
Code:
CREATE TABLE `ds_group` (
  `GroupID` mediumint(5) unsigned NOT NULL default '0',
  `DataID` mediumint(5) unsigned NOT NULL default '0',
  `Datum` datetime NOT NULL default '0000-00-00 00:00:00',
  `Data1` mediumint(6) unsigned NOT NULL default '0',
  `Data2` varchar(20) NOT NULL default '',
  `Data3` varchar(10) default NULL
  PRIMARY KEY  (`GroupID`,`DataID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


Die Anweisung(Wenn 'WHERE' denn funktionieren würde);
Code:
INSERT INTO 
	ds_group (GroupID, DataID, Datum, Data1, Data2, Data3)
VALUES 
	(1,1,'2007-06-02 02:11:21',11,12,13),
	(2,1,'2007-06-02 02:11:21',11,12,13)
ON DUPLICATE KEY UPDATE
	GroupID = VALUES(GroupID), 
	DataID = VALUES(DataID), 
	Datum = VALUES(Datum), 
	Data1 = VALUES(Data1), 
	Data2 = VALUES(Data2), 
	Data3 = VALUES(Data3)
WHERE 
	Datum < VALUES(DatumR);


Ich hoffe das war alles einigermassen verständlich.. bin nichtmehr so ganz zurechnungsfähig ;o)

*augen.reib* So.. Dann sage ich schonmal Danke und wünsche allerseits eine gute Nacht..
Grüße,
Whirpool

PS: Ich wette, heute träume ich von der MySQL-Referenz *gg*
 
Versuchs mal mit

PHP:
Datum = IF(VALUES(Datum) > Datum,VALUES(Datum),Datum),
Data1 =  IF(VALUES(Datum) > Datum,VALUES(Data1),Data1)...

ich bezweifle aber dass das klappt, aber ein versuch wäre es Wert. Noch nen Tipp nebenbei... die GroupId und DataId brauchst du nicht nochmal Updaten, die sind ja die selben.
 
ich bezweifle aber dass das klappt, aber ein versuch wäre es Wert. Noch nen Tipp nebenbei... die GroupId und DataId brauchst du nicht nochmal Updaten, die sind ja die selben.

Wunderherrlich.. ich weiss nicht was ich bei den IF's gestern anders gemacht habe, doch trotz deiner Zweifel, es funktioniert so wie du sagst :eek:))
Bei der GroupID/DataID hast du natürlich auch recht :roll:

Fürs Archiv - Die Lösung:
Code:
INSERT INTO 
ds_group (GroupID, DataID, Datum, Data1, Data2, Data3)
VALUES
(1,1,'2007-06-02 02:11:21',11,12,13),
(2,1,'2007-06-02 02:11:21',11,12,13)
ON DUPLICATE KEY UPDATE
Datum = IF(VALUES(Datum) > Datum, VALUES(Datum), Datum),
Data1 = IF(VALUES(Datum) > Datum, VALUES(Data1), Data1),
Data2 = IF(VALUES(Datum) > Datum, VALUES(Data2), Data2),
Data3 = IF(VALUES(Datum) > Datum, VALUES(Data3), Data3);

Herzlichen Dank auch!
Gruß,
Whirpool