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

[SOLUCIONADO] Mostrar aquellos casos que no han dado seguimiento en las últimas 48 horas...

Estas en el tema de Mostrar aquellos casos que no han dado seguimiento en las últimas 48 horas... en el foro de Mysql en Foros del Web. Saludos, Cree una aplicación que hace reportes de los clientes que tienen alguna avería en el teléfono y dsl. Cuando un caso requiere tiempo se ...
  #1 (permalink)  
Antiguo 31/08/2012, 09:23
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Mostrar aquellos casos que no han dado seguimiento en las últimas 48 horas...

Saludos,

Cree una aplicación que hace reportes de los clientes que tienen alguna avería en el teléfono y dsl. Cuando un caso requiere tiempo se deja abierto el ticket hasta que se resuelva el problema. En ese lapso de tiempo el cliente ha llamado y por cada llamada que haga el cliente se informa en el sistema como un nuevo ticket. La diferencia es que ese ticket se reporta como cerrado en vez de dejarlo abierto, ya que existe un reporte para ese.

Ya logré sacar el informe en una sola consulta de aquellos casos que llevan 3 ó más días abiertos y en las ultimas 48 horas han vuelto a dar seguimiento. Ahora quieren que muestre aquellos casos que llevan 3 ó más días abiertos pero no han dado seguimiento y este último mi cerebro no ha funcionado para mostrarlo en una sola consulta (si es que se puede claro está). Desde PHP lo puedo lograr muy fácil, pero me gustaría lograrlo en una sola consulta si es posible. Posteo algún ejemplo de lo que hice para les de una idea y si me pueden decir como lograrlo
Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `test` (
  2.   `test_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  3.   `foo` varchar(1) NOT NULL,
  4.   `closed` int(1) NOT NULL,
  5.   `created_datetime` datetime NOT NULL,
  6.   PRIMARY KEY (`test_id`)
  7.  
  8. --
  9. -- Dumping data for table `test`
  10. --
  11.  
  12. INSERT INTO `test` (`test_id`, `foo`, `closed`, `created_datetime`) VALUES
  13. (1, 'a', 1, '2012-08-01 11:05:02'),
  14. (2, 'a', 1, '2012-08-07 11:05:11'),
  15. (3, 'a', 0, '2012-08-21 11:05:18'),
  16. (4, 'a', 1, '2012-08-28 11:05:24'),
  17. (5, 'a', 1, '2012-08-30 11:05:33'),
  18. (6, 'a', 1, '2012-08-31 11:05:39'),
  19. (7, 'b', 1, '2012-08-31 11:05:48'),
  20. (8, 'c', 1, '2012-08-08 11:05:53'),
  21. (9, 'c', 0, '2012-08-27 11:06:01'),
  22. (10, 'd', 0, '2012-08-27 11:06:10'),
  23. (11, 'd', 1, '2012-08-28 11:06:23'),
  24. (12, 'e', 0, '2012-08-26 11:07:24'),
  25. (13, 'f', 0, '2012-08-13 11:13:35'),
  26. (14, 'f', 1, '2012-08-30 11:13:40');

La consulta que hago es
Código MySQL:
Ver original
  1. SELECT tt.foo, COUNT(tt.foo) counter FROM test t
  2.   INNER JOIN test tt ON tt.foo = t.foo
  3. WHERE t.closed = 0
  4.   AND DATE_FORMAT(t.created_datetime, "%Y-%m-%d") <= '2012-08-28'
  5.   AND DATE_FORMAT(tt.created_datetime, "%Y-%m-%d") BETWEEN '2012-08-29' AND '2012-08-31'
  6. GROUP BY tt.foo
  7.  
  8. +-----+---------+
  9. | foo | counter |
  10. +-----+---------+
  11. | a   |       2 |
  12. | f   |       1 |
  13. +-----+---------+
  14. 2 rows in set (0.00 sec)

Ahora la que debe ser, debe retornar aquellos casos que llevan más de 3 días abiertos y no han dado seguimiento en un periodo de 48 horas desde el día de hoy.

Bueno sigo intentando a ver si lo logro

¡Gracias por su tiempo!
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #2 (permalink)  
Antiguo 31/08/2012, 09:57
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años, 7 meses
Puntos: 461
Respuesta: Mostrar aquellos casos que no han dado seguimiento en las últimas 48 horas

carlos_belisaro::modeTroll('Eso no tiene que ver con php'); :P, ahora el segumiento me imagno que lo llevas en el campo foo, ahora no se si no entendi la pregunta como siempre, pero prueba así a ver

Código MySQL:
Ver original
  1. SELECT tt.foo, COUNT( tt.foo ) counter
  2. FROM test t
  3. INNER JOIN test tt ON tt.foo = t.foo
  4. WHERE t.closed =0
  5. AND DATE_FORMAT( t.created_datetime,  "%Y-%m-%d" ) <= NOW( ) - INTERVAL -3
  6. GROUP BY tt.foo
  7. LIMIT 0 , 30
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #3 (permalink)  
Antiguo 31/08/2012, 12:33
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Mostrar aquellos casos que no han dado seguimiento en las últimas 48 horas

Lol, lo sé por eso lo movi luego a MySQL pensé que lo estaba posteando aca en MySQL

Bueno no es lo que estoy buscando, en realidad me tiene que mostrar las letras c, d, e solamente en la consulta.

Si miras bien las fechas, las fechas de c, d, e no tienen reportes en las ultimas 48 horas. Las demás si tienen reportes a excepción de b que no tiene casos abiertos. Bueno la cuestion es que me debe salir solamente c, d y e en la consulta, es decir

Necesito todos aquellos casos que salen como closed = 0 y que no tenga reportes en los últimos 2 días como closed = 1.

Espero haberme dado entender mejor
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #4 (permalink)  
Antiguo 31/08/2012, 12:36
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Mostrar aquellos casos que no han dado seguimiento en las últimas 48 horas

Es más vamos a decirlo de otra forma ¿como yo logro decir en MySQL quiero todos los reportes que no estén en este renglon de fecha? Yo sé hacer algo como
Código MySQL:
Ver original
  1. fecha BETWEEN "xxxx-xx-xx" AND "xxxx-xx-xx"
Pero ¿como yo hago para decir reportes que no estén bajo ese renglon?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #5 (permalink)  
Antiguo 31/08/2012, 13:02
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Mostrar aquellos casos que no han dado seguimiento en las últimas 48 horas

Oh pero si existe NOT BETWEEN.....

Espera la voy a intentar
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #6 (permalink)  
Antiguo 31/08/2012, 13:15
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Mostrar aquellos casos que no han dado seguimiento en las últimas 48 horas

No no es
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #7 (permalink)  
Antiguo 31/08/2012, 15:40
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Mostrar aquellos casos que no han dado seguimiento en las últimas 48 horas

Bueno corillo, por ahora, lo logre hacer con dos consultas. La primera es la que ven arriba y la otra todos aquellos que reportaron despues de las 48 horas, con eso incluye casos que también pueden estar en la primera consulta, pero, en un proceso con PHP lo que hago es borrar los que están en la consulta que menciono arriba contra los que hago en la segunda consulta que son mayores de 48 horas. De esa forma solo están disponibles aquellos que no han reportado duranto un periodo de 48 horas.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #8 (permalink)  
Antiguo 02/09/2012, 08:16
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Mostrar aquellos casos que no han dado seguimiento en las últimas 48 horas

Perdón, cometí un error. Editaré luego si armo la consulta.
Tal vez así, abimaelrc. Compruébalo.

SELECT t0.foo
FROM ((SELECT foo
FROM `test`
WHERE closed =0
AND created_datetime <= SUBDATE( NOW( ) , INTERVAL 3
DAY )
)t0 LEFT JOIN (SELECT foo FROM `test` WHERE closed = 1 and created_datetime <= SUBDATE(NOW(), INTERVAL 2 DAY))t1 ON t0.foo = t1.foo) WHERE t1.foo IS NULL

Un índice al campo foo ayudaría a hacerla más rápida.

Última edición por jurena; 02/09/2012 a las 08:38
  #9 (permalink)  
Antiguo 02/09/2012, 16:59
Avatar de KsrZ  
Fecha de Ingreso: abril-2011
Ubicación: /home/KsrZ/Desktop
Mensajes: 156
Antigüedad: 13 años, 6 meses
Puntos: 26
Respuesta: Mostrar aquellos casos que no han dado seguimiento en las últimas 48 horas

@abimaelrc quizá se pueda hacer lo mismo en este caso,
http://www.forosdelweb.com/f18/verif...-dias-1011082/
pero, en una consulta
http://dev.mysql.com/doc/refman/5.0/...functions.html
usar funciones como REPLACE()
tratar el contenido como un numero entero, y luego compararlo con otra fecha, tratada de la misma forma, y con el mismo formato.

(o bien, me perdi en el tema ._. me pasa seguido)
__________________
for (var i = 0; i < 2; i++){
i = !confirm("Trata a tu código como a ti mismo.. este te esta representando.. no te dejes mal parado")? 0 : i;
}
  #10 (permalink)  
Antiguo 06/09/2012, 09:25
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Mostrar aquellos casos que no han dado seguimiento en las últimas 48 horas

Cita:
Iniciado por jurena Ver Mensaje
Perdón, cometí un error. Editaré luego si armo la consulta.
Tal vez así, abimaelrc. Compruébalo.

SELECT t0.foo
FROM ((SELECT foo
FROM `test`
WHERE closed =0
AND created_datetime <= SUBDATE( NOW( ) , INTERVAL 3
DAY )
)t0 LEFT JOIN (SELECT foo FROM `test` WHERE closed = 1 and created_datetime <= SUBDATE(NOW(), INTERVAL 2 DAY))t1 ON t0.foo = t1.foo) WHERE t1.foo IS NULL

Un índice al campo foo ayudaría a hacerla más rápida.
Tipo eres el mejor (claro despues de mí ) Lo único que habia que hacer es cambiar el simbolo de <= por >= en la de left join porque lo que se busca es los casos de los últimos dos días y estabas diciendo que son los casos menores de hace dos días. Y con eso se logra hacer en una sola consulta.

Yo sabía que se podía hacer en una sola consulta

Ya estoy feliz

Bueno gracias a todos aprendi otras formas de lograr hacer consultas.


Cita:
Iniciado por KsrZ Ver Mensaje
@abimaelrc quizá se pueda hacer lo mismo en este caso,
http://www.forosdelweb.com/f18/verif...-dias-1011082/
pero, en una consulta
http://dev.mysql.com/doc/refman/5.0/...functions.html
usar funciones como REPLACE()
tratar el contenido como un numero entero, y luego compararlo con otra fecha, tratada de la misma forma, y con el mismo formato.

(o bien, me perdi en el tema ._. me pasa seguido)
Gracias voy a verificar y te dejo saber en un rato, pero me funcionó la de jurena con un leve, diminuto, pequeñisimo cambio
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Etiquetas: casos, dado, seguimiento
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 06:40.