2009-05-09 29 views
5

Ich habe eine einfache Tabelle wie folgt.PHP MYSQL Einfügen/Aktualisieren

CREATE TABLE `stats` (
    `id` int(11) NOT NULL auto_increment, 
    `zones` varchar(100) default NULL, 
    `date` date default NULL, 
    `hits` int(100) default NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; 

Also nur einfache Treffer Zähler pro Zone pro Tag speichern.

Aber ich möchte nur den Trefferwert für den gleichen Tag erhöhen.

Ich habe das MYSQL DUPLICATE KEY UPDATE versucht, aber das wird nicht funktionieren, da ich viele Zonen an verschiedenen Daten haben kann, also kann ich sie nicht einzigartig oder Daten machen.

So ist die einzige Art, wie ich denken kann, ist zunächst eine Abfrage zu tun, um zu sehen, ob ein Datum noch existiert dann eine einfache if() für insert/update

Gibt es einen besseren Weg, da es eine solche Aufgabe zu tun vielleicht sind es viele 1000 Treffer pro Tag.

Hoffe das macht Sinn :-).

Und danke, wenn Sie beraten können.

Antwort

7

Deklarieren Sie das Tupel (zone, date) als einzigartig in Ihrer CREATE-Anweisung. Dadurch wird INSERT ... ON DUPLICATE UPDATE wie erwartet funktionieren:

CREATE TABLE `stats` (
    `id` int(11) NOT NULL auto_increment, 
    `zone` varchar(100) default NULL, 
    `date` date default NULL, 
    `hits` int(100) default NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE (`zone`, `date`) 
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; 

INSERT INTO stats (zone, date, hits) values ('zone1', 'date1', 1) ON DUPLICATE KEY UPDATE hits = hits + 1; 
+1

Ich habe gesagt, ich habe versucht, die DUPLICATE KEY UPDATE zu verwenden, und es wird nicht funktionieren, weil Zone & Datum nicht eindeutig sein kann. Beispiel eine Zone wird mehrere Tage haben, dh. Zone - Datum - Aufrufe zone1 - 2009-05-11 - 100 zone2 - 2009-05-11 - 55 zone1 - 2009-05-10 - 120 zone2 - 2009-05-10 - 88 Wenn ich ein einheitliches Datum oder eine einheitliche Zone hätte, hätte ich nur zwei Datensätze aus dem obigen Beispiel. : :-( – Lee

+0

UNIQUE (Zone, Datum) stellt sicher, dass Zone und Datum eindeutig * zusammen * sind. Es ist vollkommen in Ordnung, mehrere Einträge mit der gleichen Zone zu haben, solange Daten unterschiedlich sind. Das Gleiche gilt für mehrere Einträge mit der Das gleiche Datum und verschiedene Zonen. Aber es darf nicht zwei Einträge mit der gleichen Zone * und * Datum. Ich denke, das entspricht Ihren Anforderungen. Versuchen Sie es in einer Test-Datenbank und sehen, ob es funktioniert. –

+0

Ich versuche es erneut Ayman. ich hatte excatly, was Sie oben hatte aber wieder krank jetzt versuchen. – Lee

1
$result = mysql_query("SELECT id FROM stats WHERE zone=$zone AND date=$today LIMIT 1"); 
if(mysql_num_rows($result)) { 
    $id = mysql_result($result,0); 
    mysql_query("UPDATE stats SET hits=hits+1 WHERE id=$id"); 
} else { 
    mysql_query("INSERT INTO stats (zone, date, hits) VALUES ($zone, $today, 1)"); 
} 

So etwas, wenn ich dich richtig interpretiert habe ... das ist komplett ungetestet. Sie können herausfinden, was die Variablen sind.

+1

Diese Lösung leidet unter einer potentiellen Race-Bedingung. –

+0

Dann verwenden Sie die bessere Lösung oben: p Dachte nicht darüber nach. Guter Anruf;) – mpen