2009-05-09 25 views
5

Tengo una tabla simple de la siguiente manera.PHP MYSQL Insertar/Actualizar

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; 

Tan solo almacenando el contador de visitas simples por zona por día.

Pero solo quiero incrementar el valor de visitas para el mismo día.

He tratado para actualizar la clave MYSQL DUPLICADO pero esto no funcionará como es posible que tenga muchas zonas en diferentes fechas así que no puedo hacerlos únicos o fechas.

Así que la única manera que puedo pensar es el primero en hacer una consulta para ver si una fecha existe entonces un simple if() para insertar/actualizar

Es su mejor forma de hacer una tarea como la que hay tal vez sean muchos éxitos de 1000 por día.

Espero que esto tenga sentido :-).

Y gracias si puede asesorar.

Respuesta

7

declarar la tupla (zone, date) como único en su sentencia CREATE. Esto hará que INSERTAR ... EN ACTUALIZACIÓN DUPLICADA funcione como se esperaba:

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

Dije que traté de usar la ACTUALIZACIÓN DUPLICADA DE LLAVE y que no funcionará porque la zona y la fecha no pueden ser únicas. Ejemplo una zona tendrá múltiples días, es decir. zona - Fecha - golpea zone1 - 2009-05-11 - 100 zone2 - 2009-05-11 - 55 zone1 - 2009-05-10 - 120 zone2 - 2009-05-10 - 88 Ver si tengo una fecha o zona única, solo tendría 2 registros del ejemplo anterior. :-( – Lee

+0

único (horario, la fecha) asegura que la zona y la fecha son únicos * juntos *. Es perfectamente posible tener varias entradas con la misma zona, siempre y cuando las fechas son diferentes. Lo mismo se aplica a múltiples entradas con el misma fecha y diferentes zonas. Pero no debe haber dos entradas con la misma zona * y * fecha. Creo que esto coincide con sus requisitos. Pruébela en una base de datos de prueba y vea si funciona. –

+0

Lo intentaré de nuevo Ayman. tuve excatly lo que tenías anteriormente, pero ahora intenta enfermo otra vez. – 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)"); 
} 

Algo así, si lo he interpretado correctamente ... eso no ha sido probado. Puedes averiguar cuáles son las variables.

+1

Esta solución adolece de una posible condición de carrera. –

+0

Luego use la mejor solución anterior: p No pensé en eso. Buena llamada;) – mpen