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

Consulta a dos tablas con... ¿COUNT? ufff!!

Estas en el tema de Consulta a dos tablas con... ¿COUNT? ufff!! en el foro de Mysql en Foros del Web. A ver si hay alguien que me puede iluminar con una consulta que no me termina de salir. Tengo dos tablas, una con campañas de ...
  #1 (permalink)  
Antiguo 12/07/2011, 05:05
 
Fecha de Ingreso: mayo-2005
Mensajes: 103
Antigüedad: 18 años, 11 meses
Puntos: 1
Consulta a dos tablas con... ¿COUNT? ufff!!

A ver si hay alguien que me puede iluminar con una consulta que no me termina de salir.

Tengo dos tablas, una con campañas de publicidad para mostrar, y otra de un registro de las campañas que se le van mostrando a cada ip.

En la tabla de campañas, hay un campo que es el que me esta dando problemas, "frecuencia", que determina las veces que le puede salir una campaña a una ip.

Las tablas son asi (voy a quitar los campos que son indiferentes)

ADS_CAMPS: id / nombre / frecuencia
ADS_IPS: ip / id_camp

Teniendo en cuenta que si la frecuencia = 0 se considera que se muestra sin limite.

La consulta debería seleccionar una campaña al azar que se le pueda mostrar al usuario (que no supere la frecuencia, a parte hay otros requisitos pero lo ignoraremos para el caso)

* La variable $ip ya tendría la ip del usuario que hace la petición.
  #2 (permalink)  
Antiguo 12/07/2011, 08:21
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta a dos tablas con... ¿COUNT? ufff!!

No sé si he entendido bien, pero creo que primero tendrías que averiguar cuantas veces ha visto el cliente las campañas que ha visto. Haces un cruce de ese resultado con todas las campañas, pero trayéndote todas las campañas mediante LEFT JOIN, comparas los datos y sólo muestras aquellos cuya frecuencia es 0, y también esos otros que tienen una frecuencia mayor que cero, pero menor que el número de veces vista por ese cliente. Luego ordenas al azar y seleccionas sólo uno. El azar con by rand() no es gran cosa, y podrían buscarse otras soluciones, pero...

SELECT ac.id, ac.nombre FROM ADS_CAMPS ac LEFT JOIN (SELECT ai.id_camp, COUNT (ai.id_camp) veces from ADS_IPS ai where ai.ip = $ip GROUP BY ai.ip)T1 ON ac.id = T1.id_camp WHERE ac.frecuencia = 0 OR (ac.frecuencia > 0 AND ac.frecuencia > T1.veces) ORDER BY RAND() LIMIT 1

Seguro que hay otras consultas. No he probado nada.
  #3 (permalink)  
Antiguo 12/07/2011, 08:45
 
Fecha de Ingreso: mayo-2005
Mensajes: 103
Antigüedad: 18 años, 11 meses
Puntos: 1
Respuesta: Consulta a dos tablas con... ¿COUNT? ufff!!

Gracias, pero no muestra los resultados deseados.

La idea es sencilla:

seleccionar una campaña al azar de las posibles

las posibles son las que cumplan con uno de los dos requisitos

- frecuencia = 0 (sin limite)
- cuando la frecuencia > 0 (hay limite) no ha sido sobrepasada por la ip que hace la consulta. (Hay que contar las veces que la ip ha mostrado la campaña).

es decir, (frecuencia=0 OR veces<=frecuencia)
  #4 (permalink)  
Antiguo 12/07/2011, 09:20
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: Consulta a dos tablas con... ¿COUNT? ufff!!

Probemos así, entonces:
Código MySQL:
Ver original
  1. SELECT id, nombre, ip
  2.    (SELECT C.id, C.nombre , I.ip, C.frecuencia, COUNT(I.id_camp) TotalCamp
  3.    FROM ADS_IPS I LEFT JOIN  ADS_CAMPS C ON I.id_camp = C.id
  4.    GROUP BY C.id) T1
  5. WHERE T1.frecuencia=0 OR T1.TotalCamp<=T1.frecuencia
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: campos, count, tabla, tablas
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 00:20.