2009-05-09 16 views
5

Ho una tabella semplice come di seguito.PHP MYSQL Insert/Update

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; 

Quindi è sufficiente memorizzare un contatore di visite semplici per zona al giorno.

Ma voglio solo incrementare il valore degli hit per lo stesso giorno.

Ho provato l'AGGIORNAMENTO CHIAVE DUPLICATO di MYSQL ma questo non funzionerà in quanto potrei avere molte zone in date diverse, quindi non posso renderle uniche o date.

Quindi l'unico modo che posso pensare è il primo a fare una query per vedere se una data esiste poi fare un semplice if() per inserimento/aggiornamento

È loro un modo migliore di fare un tale compito in quanto vi forse saranno molti i 1000 colpi al giorno.

Spero che abbia senso :-).

E grazie se puoi consigliare.

risposta

7

Dichiarare la tupla (zone, date) come univoca nell'istruzione CREATE. Ciò renderà INSERT ... ON DUPLICATE UPDATE come previsto:

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

Ho detto che ho provato a usare DUPLICATE KEY UPDATE e non funzionerà perché zona e data non possono essere univoci. Esempio una zona avrà più giorni cioè. zona - data - colpisce Zona 1 - 2009-05-11 - 100 zona2 - 2009-05-11 - 55 Zona 1 - 2009-05-10 - 120 zona2 - 2009-05-10 - 88 Vedi ig I hade una data o zona uniqe Avrei solo 2 record dell'esempio sopra. :-( – Lee

+0

UNICO (zona, data) assicura che zona e data siano univoche * insieme *. È perfettamente bene avere più voci con la stessa zona purché le date siano diverse. Lo stesso vale per più voci con stessa data e zone diverse.Ma non ci devono essere due voci con la stessa zona * e * data.Penso che questo corrisponda alle tue esigenze.Di provare in un database di test e vedere se funziona. –

+0

Ill provare di nuovo Ayman. ho avuto excatly quello che aveva in precedenza ma mal riprova adesso. – 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)"); 
} 

Qualcosa del genere, se ho interpretato correttamente ... questo è completamente non testato. Puoi capire quali sono le variabili.

+1

Questa soluzione soffre di una potenziale condizione di competizione. –

+0

Quindi utilizzare la soluzione migliore sopra: p Non ci pensare. Buona telefonata;) – mpen