Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Update deun campo sumandose a si mismo

Estas en el tema de Update deun campo sumandose a si mismo en el foro de Mysql en Foros del Web. Tengo una consulta que debe actualizar el campo value, sumandole el valor actual con el nuevo ingresado, pero como se llaman de la misma manera, ...
  #1 (permalink)  
Antiguo 24/12/2012, 14:48
 
Fecha de Ingreso: junio-2012
Mensajes: 7
Antigüedad: 11 años, 10 meses
Puntos: 0
Update deun campo sumandose a si mismo

Tengo una consulta que debe actualizar el campo value, sumandole el valor actual con el nuevo ingresado, pero como se llaman de la misma manera, lo único que he conseguido es que se sume nuevamente al valor guardado pero no al nuevo ingresado que le paso, que en este caso es 1.15 a modo de ejemplo.
La tabla lo que hace es hacer insert o update dependiiendo de una clave única que armé uniendo id_campaign, id_source, id_network, date y hour.

INSERT INTO ads_tracking_clics (id_clic, id_campaign, id_source, id_network, count, value, date, hour) VALUES (NULL, 1251, 1, 2, 1, 1.15, DATE_FORMAT(NOW(), '%Y-%m-%d'), DATE_FORMAT(NOW(), '%H')) ON DUPLICATE KEY UPDATE count = count + 1, value = value + value, id_clic = LAST_INSERT_ID(id_clic)

Luego tengo un Store Procedure creado en la base que dispara varios procesos que dependen de la correcta realización de este, por lo que cualquier ayuda me será de utilidad.

Muchas gracias.
  #2 (permalink)  
Antiguo 24/12/2012, 16:48
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Update deun campo sumandose a si mismo

1) Si id_click es un auto_increment, es total y absolutamente innecesario ponerlo en el INSERT. Además, en ese caso jamás se repetirá, por lo que es imposible que haya una clave duplicada.
2) Si quieres la fecha actual, no necesitas usar NOW(), y menos hacer conversiones absurdas como pasarlo a cadena de texto, por mas que necesites la fecha sola para un campo DATE. Lo mismo en el caso de la hora actual. Ya existen funciones específicas para eso.
3) NO tiene sentido usar DATE_FORMAT() para extraer una fecha en formato AAAA-MM-DD, ni tampoco para extraer la hora. Ya existen funciones específicas para eso.
4) No debes usar palabras reservadas en los nombres de columnas, tablas o bases. Generan errores sintácticos indetectables.

Su INSERT debería ir así:
Código MySQL:
Ver original
  1. INSERT INTO ads_tracking_clics
  2.     (id_campaign, id_source, id_network, `count`, `value`, `date`, `hour`)
  3.     (1251, 1, 2, 1, 1.15, CURDATE(), CURTIME());

Los acentos graves que puse sirven para evitar que MySQL confunda los nombres con palabras reservadas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 25/12/2012, 11:22
 
Fecha de Ingreso: junio-2012
Mensajes: 7
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: Update deun campo sumandose a si mismo

Muchas gracias por el aporte!!!
Cuál sería el tipo de campo ideal para almacenar la hora? Ahora lo estoy haciendo en un campo VARCHAR(2)
  #4 (permalink)  
Antiguo 25/12/2012, 15:33
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Update deun campo sumandose a si mismo

Cita:
Ahora lo estoy haciendo en un campo VARCHAR(2)
Eso es un error tan calamitoso como guardar una fecha como VARCHAR, sólo porque luego quieres mostrarla en un formato determiando.
El tipo de columna es algo que puedes ver en el manual de referencia (Capítulo 11. Tipos de columna). No hay nada que inventar en el tema:
- Fechas -> DATE
- Fechas con horas -> DATETIME, TIMESTAMP.
- Horas -> TIME.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 25/12/2012, 19:33
 
Fecha de Ingreso: junio-2012
Mensajes: 7
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: Update deun campo sumandose a si mismo

Gracias por la respuesta!!
Igualmente lo que necesito es tomar sólo la hora, con los minutos y segundos en 0, ya que lo que hago es generar bloques por hora sobre un mismo registro que va sólo actualizando un campo en el que cuento la cantidad de impresiones que se generan.
La clave única, con varios campos es porque en esa tabla genero el autoincremental, para relacionarlo a otras y la clave única para no generar valores repetidos de distintas campañas por hora.
O sea me serviría tanto guardar algo así 22:00:00 como así 22, pero no con los minutos y segundos que no sea 00 porque me generaría muchos registros y esto lo estoy preparando para contar 10 billones de registros por mes. Adjunto los códigos para que se pueda entender mejor el problema.

Esta es la estructura de la tabla:

CREATE TABLE IF NOT EXISTS `ads_tracking_clics` (
`id_clic` int(11) NOT NULL AUTO_INCREMENT,
`id_campaign` int(11) NOT NULL,
`id_source` int(11) NOT NULL,
`id_network` int(11) NOT NULL,
`count` decimal(10,0) NOT NULL,
`value` decimal(10,4) DEFAULT NULL COMMENT 'último valor',
`value_cum` decimal(10,4) DEFAULT NULL COMMENT 'valor acumulado',
`date` date NOT NULL,
`hour` time NOT NULL,
PRIMARY KEY (`id_clic`),
UNIQUE KEY `key_clics` (`id_campaign`,`id_source`,`id_network`,`date`,`ho ur`),
KEY `id_campaign` (`id_campaign`),
KEY `id_source` (`id_source`),
KEY `id_network` (`id_network`),
KEY `date` (`date`),
KEY `hour` (`hour`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

Y así tengo la consulta hasta ahora:

$query = "INSERT INTO ads_tracking_clics (id_campaign, id_source, id_network, count, value, value_cum, `DATE`, `HOUR`) VALUES (1253, 1, 2, 1, 1.15, 1.15, CURDATE(), HOUR(CURTIME())) ON DUPLICATE KEY UPDATE count = count + 1, value = 1.15, value_cum = value_cum + value, id_clic = LAST_INSERT_ID(id_clic)";
$result = mysql_query($query);

// PROCEDURE SetClic(id_tracking, id_carrier, id_category, id_country, id_language, id_model, id_os, id_resolution, id_slot)
if($result){
$query = "CALL SetClic(".mysql_insert_id().", 1, 1, 13, 2, 45, 3, 5, 4567)";
$result = mysql_query($query);
}

Y el Stored Procedure en la base es así:

DELIMITER //
CREATE PROCEDURE SetClic(IN id_tracking INT(11), IN id_carrier INT(11), IN id_category INT(11), IN id_country INT(11), IN id_language INT(11), IN id_model INT(11), IN id_os INT(11), IN id_resolution INT(11), IN id_slot INT(11))
BEGIN
INSERT INTO ads_tracking_carrier (id_tracking, id_carrier, count, `action`) VALUES (id_tracking, id_carrier, 1, 2) ON DUPLICATE KEY UPDATE count = count + 1;
INSERT INTO ads_tracking_category (id_tracking, id_category, count, `action`) VALUES (id_tracking, id_category, 1, 2) ON DUPLICATE KEY UPDATE count = count + 1;
INSERT INTO ads_tracking_countries (id_tracking, id_country, count, `action`) VALUES (id_tracking, id_country, 1, 2) ON DUPLICATE KEY UPDATE count = count + 1;
INSERT INTO ads_tracking_language (id_tracking, id_language, count, `action`) VALUES (id_tracking, id_language, 1, 2) ON DUPLICATE KEY UPDATE count = count + 1;
INSERT INTO ads_tracking_model (id_tracking, id_model, count, `action`) VALUES (id_tracking, id_model, 1, 2) ON DUPLICATE KEY UPDATE count = count + 1;
INSERT INTO ads_tracking_os (id_tracking, id_os, count, `action`) VALUES (id_tracking, id_os, 1, 2) ON DUPLICATE KEY UPDATE count = count + 1;
INSERT INTO ads_tracking_resolution (id_tracking, id_resolution, count, `action`) VALUES (id_tracking, id_resolution, 1, 2) ON DUPLICATE KEY UPDATE count = count + 1;
INSERT INTO ads_tracking_slot (id_tracking, id_slot, count, `action`) VALUES (id_tracking, id_slot, 1, 2) ON DUPLICATE KEY UPDATE count = count + 1;
END //
DELIMITER ;

Etiquetas: update
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:30.