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

SQL para obtener últimos registros

Estas en el tema de SQL para obtener últimos registros en el foro de Mysql en Foros del Web. Saludos, me preguntaba si se puede ejecutar en una sola consulta lo siguiente: Tengo 3 tablas y quiero obtener los datos de la ultima llamada ...
  #1 (permalink)  
Antiguo 16/03/2012, 09:56
 
Fecha de Ingreso: mayo-2003
Mensajes: 18
Antigüedad: 20 años, 10 meses
Puntos: 3
SQL para obtener últimos registros

Saludos, me preguntaba si se puede ejecutar en una sola consulta lo siguiente:
Tengo 3 tablas y quiero obtener los datos de la ultima llamada al cliente asi como de su ultimo servicio
las tablas estarian asi:
Código:
LLAMADAS
id | atiende | fecha          | cliente
1  |RINGO    |2011-10-30 08:00|1058
2  |JORGE    |2011-10-30 14:00|128
3  |JUAN     |2011-10-30 16:20|123
4  |PAUL     |2011-10-31 07:00|1058
5  |JORGE    |2011-10-31 11:00|964
6  |JUAN     |2011-11-01 08:00|960
7  |JUAN     |2011-11-03 08:40|123
8  |RINGO    |2011-11-05 10:00|1058
9  |PAUL     |2011-11-06 17:00|128
10 |RINGO    |2011-11-12 09:00|1058

SERVICIO

id | fecha    |cliente 
1  |2011-02-06|123
2  |2011-06-15|128
3  |2011-08-19|1058
4  |2011-11-06|128
5  |2011-11-06|1058
6  |2011-12-07|123

CONT_SERVICIO
id |servicio| id_serv|
1  |ACEITE  |1
2  |VALVULA |1
3  |FRENOS  |2
4  |ACEITE  |3
5  |PINTURA |3
6  |VALVULA |4
7  |FRENOS  |5
8  |FRENOS  |6
Y obtener un resultado con la ultima llamda al cliente y su ultimo servicio

Código:
CLIENTE|ATIENDE|FECHA_LLAM      |FECHA_SERV  |SERVICIO
123    |JUAN   |2011-11-03 08:40|2011-12-07  |FRENOS
128    |PAUL   |2011-11-06 17:00|2011-11-06  |VALVULA
1058   |RINGO  |2011-11-12 09:00|2011-11-06  |FRENOS
Actualmente lo hago en 2 consultas pero me pregunto si se podra realizar en una sola.
  #2 (permalink)  
Antiguo 16/03/2012, 10:27
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: SQL para obtener últimos registros

Hola alfeyo:

Desde mi punto de vista, hay una laguna en tu modelo de datos, igual y sólo es cuestión de que nos indiques tu lógica de negocios:

¿Cómo ligas tus tablas LLAMADAS con SERVICIOS? por fecha no se puede hacer, pues

Por fecha, no puedes hacerlo, porque según los resultados que muestras no hay una regla que defina esto:

Código:
FECHA_LLAM      |FECHA_SERV
2011-11-03 08:40|2011-12-07
2011-11-06 17:00|2011-11-06
2011-11-12 09:00|2011-11-06
Ahora bien, si trataras de ligarlo por el cliente (obteniendo de la tabla SERVICIOS también el último servicio) también tendrías problemas. Supongamos que soy el dueño de una flotilla de autos (ojalá fuera cierto) hago una llamada para reportar un problema con FRENOS y me atiene JUAN, 5 minutos después realizo una segunda llamada para reportar un problema con ACEITE, pero ahora me RINGO... entonces ¿cómo sería la lógica que seguirías para asignar cada servicio a cada llamada?...

Saludos
Leo
  #3 (permalink)  
Antiguo 16/03/2012, 12:27
 
Fecha de Ingreso: mayo-2003
Mensajes: 18
Antigüedad: 20 años, 10 meses
Puntos: 3
Respuesta: SQL para obtener últimos registros

se me paso explicar como funciona el sistema. lo uso para sacar la ultima compra o servicio y la ultima llamada que se le hizo al cliente.

por ejemplo en la consulta quiero que saque el ultimo servicio con la ultima llamada hecha a los clientes que compraron aceite

algo asi:

Código:
select servicio.cliente,  max(servicio.fecha), cont_servicio.servicio 
from servicio inner join cont_servicio 
on servicio.id = con_servicio.id_serv 
where cont_servicio.servicio =  "ACEITE" 
group by servicio.cliente

y el de clientes lo sacaria asi:
select cliente, max(fecha), atiende from llamadas group by cliente
pero no se si a si este correcto sacar el ultimo registro por cliente.
  #4 (permalink)  
Antiguo 16/03/2012, 12:52
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: SQL para obtener últimos registros

Hola de nuevo...

Tal como lo planteas, se puede dar el problema que te comento en el post anterior... Supongamos que un mismo cliente realiza varias llamadas y cada llamada es atendida por un empleado diferente... al querer ligar los servicios con las llamadas estarías ligando el el último servicio para cada cliente, PERO ESTO NO ES EL MISMO PARA CADA LLAMADA... Hay que volver a lo básico que sería revisar las relaciones entre tus tablas.

Un cliente puede tener n llamadas
Un empleado puede atender n llamadas
¿Todas las llamadas generan un servicio?
¿Una llamada es atendida por 1 u sólo 1 empleado o puede ser atendida por n empleados?
Una llamada puede tener 1 y sólo 1 servicio o puede tener n servicios?

Un servicio puede tener n detalles de servicio

Desde mi punto de vista, y a reserva de que nos digas más detalles de tu lógica de negocio, creo que faltaría agregar a la servicios la llamada que justifica ese servicio...

Saludos
Leo.
  #5 (permalink)  
Antiguo 16/03/2012, 14:18
 
Fecha de Ingreso: mayo-2003
Mensajes: 18
Antigüedad: 20 años, 10 meses
Puntos: 3
Respuesta: SQL para obtener últimos registros

Gracias por contestar,
le puse servicios pero también puede llamarles ventas.

las llamadas son independientes de los servicios
es decir le pueden llamar al cliente n veces y este no tener algún servicio (es decir pueden llamar al cliente para ofrecerle una promoción)

la llamada solo es atendida solo un empleado pero un cliente puede recibir llamadas de varios empleados generando un registro por cada llamada, asi como en la tabla llamadas el cliente 1058 que tiene 3 llamadas de 2 distintas personas.

la tabla servicio y cont_servicio funcionan como una factura en servicio van datos generales y en cont_servicio va el artículo comprado.

lo que busco es ver si en un solo query puedo sacar la última llamada hecha y el último servicio por cada cliente y que este haya tenido el servicio por ejemplo de frenos.

y me devuelva mas o menos este resultado:

Código:
CLIENTE|ATIENDE|FECHA_LLAM      |FECHA_SERV  |SERVICIO
123    |JUAN   |2011-11-03 08:40|2011-12-07  |FRENOS
1058   |RINGO  |2011-11-12 09:00|2011-11-06  |FRENOS
donde me da que juan fue el ultimo que llamo al cliente 123 y su ultimo servicio de frenos fue el 2011-12-07
  #6 (permalink)  
Antiguo 16/03/2012, 16:14
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: SQL para obtener últimos registros

Hola de nuevo:

Si entendí correctamente y partiendo de los datos que estás poniendo de ejemplo hay un error en la salida que estás esperando, dices que esperas estos resultados.

Código:
CLIENTE|ATIENDE|FECHA_LLAM      |FECHA_SERV  |SERVICIO
123    |JUAN   |2011-11-03 08:40|2011-12-07  |FRENOS
1058   |RINGO  |2011-11-12 09:00|2011-11-06  |FRENOS
Sin embargo, si revisas tus tablas, la fecha 2011-11-06 aparece para los servicios 4 y 5

SERVICIO
id | fecha |cliente
4 |2011-11-06|128
5 |2011-11-06|1058

Pero en la tabla CONT_SERVICIOS no se indica que alguno de estos servicios sea ACEITE:

Código:
CONT_SERVICIO
id |servicio| id_serv|
6  |VALVULA |4
7  |FRENOS  |5
Este pequeño error me trajo de cabeza un buen rato, porque creí que la consulta que estaba haciendo estaba mal... supongo que te confundiste con este registro:

Código:
CONT_SERVICIOS
4  |ACEITE  |3
Si estoy en lo correcto, el resultado que debería arrojar la consulta es

Código:
+---------+---------+---------------------+------------+----------+
| cliente | atiende | fecha_llama         | fecha_serv | servicio |
+---------+---------+---------------------+------------+----------+
|     123 | JUAN    | 2011-11-03 08:40:00 | 2011-02-06 | ACEITE   |
|    1058 | RINGO   | 2011-11-12 09:00:00 | 2011-08-19 | ACEITE   |
+---------+---------+---------------------+------------+----------+
En fin, si estoy equivocado me lo comentas...

Sigo pensando que tienes un mal modelo de datos, pero en vista que dices que es correcto, pues al cliente lo que pida... una forma de obtener el resultado esperado sería así:

Código MySQL:
Ver original
  1. mysql> SELECT l.cliente, l.atiende, T2.max_fecha fecha_llama,
  2.     ->    T1.max_fecha fecha_serv, T1.servicio
  3.     -> FROM llamadas l
  4.     -> INNER JOIN
  5.     -> (
  6.     ->    SELECT MAX(fecha) max_fecha, cliente, cs.servicio
  7.     ->    FROM servicios s
  8.     ->    INNER JOIN cont_servicio cs ON cs.id_serv = s.id
  9.     ->    WHERE cs.servicio = 'ACEITE'
  10.     ->    GROUP BY s.cliente, cs.servicio
  11.     -> ) T1 ON l.cliente = T1.cliente
  12.     -> INNER JOIN
  13.     -> (
  14.     ->    SELECT MAX(fecha) max_fecha, cliente
  15.     ->    FROM llamadas
  16.     ->    GROUP BY cliente
  17.     -> ) T2 ON T2.max_fecha = L.fecha AND T2.cliente = l.cliente;
  18. +---------+---------+---------------------+------------+----------+
  19. | cliente | atiende | fecha_llama         | fecha_serv | servicio |
  20. +---------+---------+---------------------+------------+----------+
  21. |     123 | JUAN    | 2011-11-03 08:40:00 | 2011-02-06 | ACEITE   |
  22. |    1058 | RINGO   | 2011-11-12 09:00:00 | 2011-08-19 | ACEITE   |
  23. +---------+---------+---------------------+------------+----------+
  24. 2 rows in set (0.02 sec)

Puedes ejecutar cada subconsulta por separado para que entiendas la lógica que seguí para filtrar la información. cualquier duda o comentario lo comentas en el foro... igual y por el puente no tengo chance de contestarte hasta el próximo martes, pero espero que te sea de utilidad.

Saludos
Leo.
  #7 (permalink)  
Antiguo 16/03/2012, 17:32
 
Fecha de Ingreso: mayo-2003
Mensajes: 18
Antigüedad: 20 años, 10 meses
Puntos: 3
Respuesta: SQL para obtener últimos registros

Muuchas gracias es justamente lo que buscaba no me sabia lo de la doble subquery te sacaste un 10

Etiquetas: registros, sql, tabla
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:50.