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

Consulta problematica

Estas en el tema de Consulta problematica en el foro de Mysql en Foros del Web. Hola a todos estoy desarrollando un proyecto que ya estaba hecho la cual consta de unas 50 tablas y ya con unos 40 000 registros ...
  #1 (permalink)  
Antiguo 16/02/2012, 15:23
 
Fecha de Ingreso: marzo-2011
Mensajes: 2
Antigüedad: 13 años
Puntos: 0
Consulta problematica

Hola a todos estoy desarrollando un proyecto que ya estaba hecho la cual consta de unas 50 tablas y ya con unos 40 000 registros aproximadamente. El problema surge de que este es un proyecto antiguo, esta hecho con php MVC y mysql (sin PDO).

El asunto es que tenga una tabla de contacto y una tabla de llamada_contacto, el cual se le hace una llamada al contacto registrando una calificacion de llamada y una fecha de llamada.. algo asi:

cod_contacto fec_llamada calificacion
1 2011/01/01 01:00 00 0.4
1 2011/01/01 02:00 00 0.4
1 2011/02/01 01:00 00 0.5
2 2011/02/01 01:00 00 0.7
2 2011/02/05 05:00 00 0.6
2 2011/02/05 05:30 00 0.8
3 2011/02/05 05:30 00 0.9
3 2011/02/05 05:35 00 0.9

Es una busqueda donde se pide ingresar por dos campos de texto el rango de probabilidad (desde - hasta), ejm si quiere calificacion desde 0.7 hasta 0.9 de los contactos que tiene esa calificacion en ese rando de SU ULTIMA LLAMADA

entonces para obtener la califiacion de la ultima llamada tendria que hacer esto:
SELECT COD_CONTACTO, MAX(FEC_LLAMADA) FROM CONTACTO_LLAMADA GROUP BY COD_CONTACTO
(ya que el group by te agruparia por codigo de contacto pero me daria el primer registro del contacto en esa tabla y se quiere el registro de su ULTIMA LLAMADA)

entonces eso tendria que meterlo en una subconsulta asi:
SELECT * FROM COD_CONTACTO WHERE COD_CONTACTO IN (SUBCONSULTA)

pero no se puede meter un subconsulta de 2 campos en un campo... ahi esta mi problema...

Por fa, si alguien tiene una solucion alterna o alguna solucion a esto respondame.
Saludos.
  #2 (permalink)  
Antiguo 16/02/2012, 15:50
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consulta problematica

Hola Josss777:

No estoy seguro si entendí bien, pero checa este script para ver si es más o menos lo que necesitas:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM CONTACTO_LLAMADA;
  2. +--------------+---------------------+--------------+
  3. | cod_contacto | fec_llamada         | calificacion |
  4. +--------------+---------------------+--------------+
  5. |            1 | 2011-01-01 01:00:00 |          0.4 |
  6. |            1 | 2011-01-01 02:00:00 |          0.4 |
  7. |            1 | 2011-02-01 01:00:00 |          0.5 |
  8. |            2 | 2011-02-01 01:00:00 |          0.7 |
  9. |            2 | 2011-02-05 05:00:00 |          0.6 |
  10. |            2 | 2011-02-05 05:30:00 |          0.8 |
  11. |            3 | 2011-02-05 05:30:00 |          0.9 |
  12. |            3 | 2011-02-05 05:35:00 |          0.9 |
  13. +--------------+---------------------+--------------+
  14. 8 rows in set (0.09 sec)
  15.  
  16.  
  17. mysql> SELECT CL.cod_contacto, MAX(CL.fec_llamada) max_fec_llamada
  18.     -> FROM CONTACTO_LLAMADA CL GROUP BY CL.cod_contacto;
  19. +--------------+---------------------+
  20. | cod_contacto | max_fec_llamada     |
  21. +--------------+---------------------+
  22. |            1 | 2011-02-01 01:00:00 |
  23. |            2 | 2011-02-05 05:30:00 |
  24. |            3 | 2011-02-05 05:35:00 |
  25. +--------------+---------------------+
  26. 3 rows in set (0.00 sec)
  27.  
  28.  
  29. mysql> SELECT T1.* FROM CONTACTO_LLAMADA T1 INNER JOIN
  30.     -> (
  31.     -> SELECT CL.cod_contacto, MAX(CL.fec_llamada) max_fec_llamada
  32.     -> FROM CONTACTO_LLAMADA CL GROUP BY CL.cod_contacto
  33.     -> ) T2 ON
  34.     -> T1.cod_contacto = T2.cod_contacto AND
  35.     -> T1.fec_llamada = T2.max_fec_llamada
  36.     -> WHERE
  37.     -> T1.calificacion BETWEEN 0.7 AND 0.9;
  38. +--------------+---------------------+--------------+
  39. | cod_contacto | fec_llamada         | calificacion |
  40. +--------------+---------------------+--------------+
  41. |            2 | 2011-02-05 05:30:00 |          0.8 |
  42. |            3 | 2011-02-05 05:35:00 |          0.9 |
  43. +--------------+---------------------+--------------+
  44. 2 rows in set (0.02 sec)


Para el caso del cod_contacto = 1 la fecha máxima corresponde a un
2011-02-01 01:00:00, pero su calificación es de 0.5, y por lo tanto no está comprendida entre el rango de 0.7 a 0.9. Dale un vistazo para ver si es te puede servir.

Saludos
Leo.
  #3 (permalink)  
Antiguo 16/02/2012, 16:08
 
Fecha de Ingreso: marzo-2011
Mensajes: 2
Antigüedad: 13 años
Puntos: 0
Respuesta: Consulta problematica

Tu solucion es muy buena, la pense igual, pero no funciona para esta consulta porque la consulta que tengo tiene ya una select de contactos algo asi:

SELECT¨campo1, campo2, campo3, (select campox from tabla_x where tabla.campo4 = campo4) asl 'algo' ... (10 listados mas) .... from contacto where campo1 = 'blabla' and campo2 > 2 and campo3 between fecha1 and fecha2 and cod_contacto in (subconsulta_problematica)

es decir necesariamente tiene que ser una subconsulta
  #4 (permalink)  
Antiguo 16/02/2012, 16:19
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consulta problematica

Hola de nuevo

No entiendo por qué insiste que es necesario hacer una subconsulta... sobre todo por la manera en que pones los ejemplos, tu puedes seguir manejando en el SELECT tantas consultas como se te venga en gana y manejar también con JOINS tantas subconsultas como necesites:


Código MySQL:
Ver original
  1. mysql> SELECT T1.*,
  2.     -> (SELECT MAX(fec_llamada) FROM CONTACTO_LLAMADA
  3.     -> WHERE cod_contacto = 1 ) fecha_cod_1,
  4.     -> (SELECT descripcion FROM tabla1 WHERE id = 4) otro_campo,
  5.     -> (SELECT descripcion FROM tabla2 WHERE id = 2) uno_mas
  6.     -> FROM CONTACTO_LLAMADA T1 INNER JOIN
  7.     -> (
  8.     -> SELECT CL.cod_contacto, MAX(CL.fec_llamada) max_fec_llamada
  9.     -> FROM CONTACTO_LLAMADA CL GROUP BY CL.cod_contacto
  10.     -> ) T2 ON
  11.     -> T1.cod_contacto = T2.cod_contacto AND
  12.     -> T1.fec_llamada = T2.max_fec_llamada
  13.     -> WHERE
  14.     -> T1.calificacion BETWEEN 0.7 AND 0.9;
  15. +--------------+---------------------+--------------+---------------------+-----
  16. -------+---------+
  17. | cod_contacto | fec_llamada         | calificacion | fecha_cod_1         | otro
  18. _campo | uno_mas |
  19. +--------------+---------------------+--------------+---------------------+-----
  20. -------+---------+
  21. |            2 | 2011-02-05 05:30:00 |          0.8 | 2011-02-01 01:00:00 | cuat
  22. ro     | dos     |
  23. |            3 | 2011-02-05 05:35:00 |          0.9 | 2011-02-01 01:00:00 | cuat
  24. ro     | dos     |
  25. +--------------+---------------------+--------------+---------------------+-----
  26. -------+---------+
  27. 2 rows in set (0.02 sec)

¿Por qué dices entonces que no se puede? ¿Intentaste hacer la consulta con la propuesta que te puse?, ¿La consulta te marca algún error} si es así ¿Cuál es el error?, ¿La consulta no te regresa lo que esperas? ¿donde está el fallo?

Saludos
Leo.

Etiquetas: php, problematica, registros, select, sql, tabla, campos
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 11:15.