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

2 INNER JOIN con COUNT a la misma tabla

Estas en el tema de 2 INNER JOIN con COUNT a la misma tabla en el foro de Mysql en Foros del Web. Tengo una tabla que tiene un campo primario autoincremental y otro llamado action que puede tener valor 1, 2 o 3 según sea impresión, clic ...
  #1 (permalink)  
Antiguo 08/10/2012, 09:18
 
Fecha de Ingreso: junio-2012
Mensajes: 7
Antigüedad: 11 años, 10 meses
Puntos: 0
2 INNER JOIN con COUNT a la misma tabla

Tengo una tabla que tiene un campo primario autoincremental y otro llamado action que puede tener valor 1, 2 o 3 según sea impresión, clic o conversión.
Necesito hacer una consulta que me devuelva la cantidad de clics y conversiones del día. Hice esta consulta que funciona, pero demora mucho ya que son 2 millones de registros aproximadamente y serán cada vez más:

Código MySQL:
Ver original
  1. SELECT COUNT(TH.id_tracking) AS clics, COUNT(CONV.id_tracking) AS conversions
  2. FROM ads_tracking_history TH
  3. LEFT JOIN ads_tracking_history CONV ON(TH.id_tracking = CONV.id_tracking AND CONV.action = '3')
  4. WHERE DATE_FORMAT(TH.date, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d')

Estoy probando de reemplazar LEFT JOIN por INNER JOIN, lo cual la hace muchísimo más rápido pero sólo me trae los datos de las conversiones en ambas columnas, así:

Código MySQL:
Ver original
  1. SELECT COUNT(TH.id_tracking) AS clics, COUNT(CONV.id_tracking) AS conversions
  2. FROM ads_tracking_history TH
  3. INNER JOIN ads_tracking_history CONV ON(TH.id_tracking = CONV.id_tracking AND CONV.action = '3')
  4. WHERE DATE_FORMAT(TH.date, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d')
La tabla completa tiene esta estructura:

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `ads_tracking_history` (
  2.   `id_tracking` int(11) NOT NULL,
  3.   `id_client` int(11) DEFAULT NULL,
  4.   `id_carrier` int(11) DEFAULT NULL,
  5.   `id_network` int(11) DEFAULT NULL,
  6.   `id_campaign` int(11) DEFAULT NULL,
  7.   `id_country` int(11) DEFAULT NULL,
  8.   `id_model` int(11) DEFAULT NULL,
  9.   `id_resolution` int(11) DEFAULT NULL,
  10.   `id_slot` int(11) DEFAULT NULL,
  11.   `value` decimal(10,4) NOT NULL DEFAULT '0.0000',
  12.   `cpa` decimal(10,2) DEFAULT NULL,
  13.   `action` enum('1','2','3') CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL COMMENT 'impression, click, conversion',
  14.   `ip` int(10) unsigned DEFAULT NULL,
  15.   `host` varchar(255) CHARACTER SET utf8 COLLATE utf8_spanish_ci DEFAULT NULL,
  16.   `lang` varchar(2) CHARACTER SET utf8 COLLATE utf8_spanish_ci DEFAULT NULL,
  17.   `type` enum('1','2','3') CHARACTER SET utf8 COLLATE utf8_spanish_ci DEFAULT NULL COMMENT 's2s, img, script',
  18.   `referer` varchar(255) CHARACTER SET utf8 COLLATE utf8_spanish_ci DEFAULT NULL,
  19.   `sub_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_spanish_ci DEFAULT NULL,
  20.   `sub_id1` varchar(32) CHARACTER SET utf8 COLLATE utf8_spanish_ci DEFAULT NULL,
  21.   `sub_id2` varchar(32) CHARACTER SET utf8 COLLATE utf8_spanish_ci DEFAULT NULL,
  22.   PRIMARY KEY (`id_tracking`),
  23.   KEY `id_client` (`id_client`),
  24.   KEY `id_carrier` (`id_carrier`),
  25.   KEY `id_network` (`id_network`),
  26.   KEY `id_campaign` (`id_campaign`),
  27.   KEY `id_country` (`id_country`),
  28.   KEY `id_model` (`id_model`),
  29.   KEY `id_resolution` (`id_resolution`),
  30.   KEY `id_slot` (`id_slot`),
  31.   KEY `cpa` (`cpa`),
  32.   KEY `action` (`action`),
  33.   KEY `date` (`date`)
  34. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

¿Cómo puedo hacer la consulta para usar el INNER JOIN?

Muchas gracias a quien pueda ayudarme

Última edición por gnzsoloyo; 08/10/2012 a las 10:25 Razón: Usar etiquetas para visualizar el SQL
  #2 (permalink)  
Antiguo 08/10/2012, 10:41
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: 2 INNER JOIN con COUNT a la misma tabla

Código MySQL:
Ver original
  1. SELECT SUM(if(action=1,1,0)) as impresion,
  2. SUM(if(action=2,1,0)) as clic,
  3. SUM(if(action=3,1,0)) as conversion
  4. FROM ads_tracking_history
  5. WHERE DATE_FORMAT(TH.DATE, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d');

No te compliques la vida....

Otra complicación es usar `DATE` TIMESTAMP teniendo DATETIME.

TIMESTAMP son milisegundos

DATETIME es YYYY-mm-dd hh:mm:ss
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 08/10/2012, 11:30
 
Fecha de Ingreso: junio-2012
Mensajes: 7
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: 2 INNER JOIN con COUNT a la misma tabla

Muchas gracias quimfv, a veces la cosa es más simple y uno se enreda solo.

Etiquetas: count, inner-join
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 17:12.