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

[SOLUCIONADO] Sacar estado máximo con dos tablas relacionadas

Estas en el tema de Sacar estado máximo con dos tablas relacionadas en el foro de Mysql en Foros del Web. Hola Foreros y Expertos Soy novatillo en sql y en este foro. Os presento mi problema y desde ya mil GRACIAS, Tengo dos tablas; ESTADOS ...
  #1 (permalink)  
Antiguo 26/03/2013, 09:42
 
Fecha de Ingreso: marzo-2013
Ubicación: Madrid
Mensajes: 3
Antigüedad: 11 años
Puntos: 0
Sacar estado máximo con dos tablas relacionadas

Hola Foreros y Expertos

Soy novatillo en sql y en este foro. Os presento mi problema y desde ya mil GRACIAS,

Tengo dos tablas;

ESTADOS
ID_ESTADO ESTADO FECHA
1 abierta 26/01/2012
1 tratando 27/01/2012
1 tratando 28/01/2012
1 cerrada 29/01/2012
2 abierta 27/01/2012
etc

CLIENTES
ORT NOMBRE APELLIDOS
1 ana martín

Estas dos tablas están relacionadas por ID_ESTADO <-> ORT

La tabla estados contiene todos los estados que puede tener un ID_ESTADO, incluso algunos estados repetidos pero siempre con fecha
diferente.
La tabla CLIENTES sólo tiene un cliente por cada "ORT"

Lo que necesito es, relacionar las dos tablas y que para cada ORT, me saque la información el último estado. Es decir para el
ID_ESTADO 1 sería

1 ana martin 1 cerrada 29/01/2012

Buscando por el foro he podido avanzar algo;

SELECT CLIENTES.ORT, CLIENTES.NOMBRE ESTADOS.ESTADO, MAX(ESTADOS.FECHA) as RECORD FROM
(CLIENTES INNER JOIN ESTADOS ON CLIENTES.ORT = ESTADOS.ID_ESTADO)
GROUP BY ESTADOS.ID_ESTADO

Esto saca el última fecha por cada cliente pero el estado no concuerda con la fecha


Me estoy volviendo bastante loco con el asunto, por lo que agradezco la ayuda.
Muchas Gracias y enhorabuena por el foro
  #2 (permalink)  
Antiguo 26/03/2013, 09:50
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: Sacar estado máximo con dos tablas relacionadas

Lo que pasa es que estás perdiendo la perspectiva de lo que buscas:
Cita:
Lo que necesito es, relacionar las dos tablas y que para cada ORT, me saque la información el último estado
Entonces no se debe agrupar por estado, sino por ORT...
Código MySQL:
Ver original
  1.     C.ORT,
  2.     C.NOMBRE
  3.     E.ESTADO,
  4.     MAX(E.FECHA) RECORD
  5.     CLIENTES C INNER JOIN ESTADOS E ON C.ORT = E.ID_ESTADO
  6. GROUP BY C.ORT

De todos modos, no se comprende la relación entre el ORT (que no se ve qué significa) con el Estado (que tampoco se sabe qué es).
Falta info para saber si la consulta está bien ideada.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 26/03/2013, 10:24
 
Fecha de Ingreso: marzo-2013
Ubicación: Madrid
Mensajes: 3
Antigüedad: 11 años
Puntos: 0
Respuesta: Sacar estado máximo con dos tablas relacionadas

Hola gnzsoloyo, gracias por tu rápida respuesta.

He probado lo que me indicas y me sigue saliendo la última fecha para cada cliente pero el ESTADO de la tabla ESTADOS incorrecto. El resultado que me sale es

1 ana martin abierta 29/01/2012

cuando debería de salir
1 ana martin cerrada 29/01/2012

ORT es el nº de cliente. A cada nuevo cliente se le asigna un nº de cliente que se llama ORT en la tabla CLIENTES.
Ese mismo nº cliente se llama ID_ESTADO en la tabla ESTADOS...

Por favor, si no me he explicado correctamente dímelo y te doy los detalles que necesites.
Gracias!
  #4 (permalink)  
Antiguo 26/03/2013, 11:10
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: Sacar estado máximo con dos tablas relacionadas

La verdad, el problema es un diseño defectuoso, que sólo se percibe cuando tienes algo de experiencia en este tipo de detalles.
El problema máximo es que poner un atributo "estado" como cadena de caracteres es un error conceptual. Los "estados" deben ser siempre numéricos para poder jerarquizarlos. Las descripciones de los estados, esos pueden ser cadenas descriptivas. De ese modo lo puedes manejar mucho más fácil, sea con una tabla parametrizada de referencia, o bien usando campos ENUM.

Pero así como está, no se puede hacer sin darle una mejor parametrización a la consulta.

Esto tal vez sirva:
Código MySQL:
Ver original
  1. SELECT ORT, NOMBRE, ESTADO, RECORD
  2.     (SELECT
  3.         C.ORT,
  4.         C.NOMBRE
  5.         E.ESTADO,
  6.         MAX(E.FECHA) RECORD
  7.     FROM
  8.         CLIENTES C INNER JOIN ESTADOS E ON C.ORT = E.ID_ESTADO
  9.     ORDER BY FIND_IN_SET(E.ESTADO, 'abierta, tratando, cerrada') DESC) T1
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 26/03/2013, 12:02
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Sacar estado máximo con dos tablas relacionadas

Otra forma para obtener este resultado sería así:

Código MySQL:
Ver original
  1. mysql> SELECT c.ort, c.nombre, c.apellidos, e.estado, e.fecha FROM
  2.     -> clientes C
  3.     -> INNER JOIN estados E ON c.ort = e.id_estado
  4.     -> INNER JOIN
  5.     -> ( SELECT id_estado, MAX(fecha) max_fecha
  6.     ->   FROM estados
  7.     ->   GROUP BY id_estado) T
  8.     -> ON T.id_estado = E.id_estado AND T.max_fecha = E.fecha;
  9. +------+--------+-----------+---------+------------+
  10. | ort  | nombre | apellidos | estado  | fecha      |
  11. +------+--------+-----------+---------+------------+
  12. |    1 | ana    | martin    | cerrada | 2012-01-29 |
  13. +------+--------+-----------+---------+------------+
  14. 1 row in set (0.00 sec)

El truco está en la subconsulta del segundo INNER JOIN, obtienes la MAX(FECHA) para cada estado y la utilizas para filtrar la información... Haz la prueba, tanto la consulta de gnzsoloyo como la mía deberían de funcionar.

Saludos
Leo.
  #6 (permalink)  
Antiguo 01/04/2013, 01:14
 
Fecha de Ingreso: marzo-2013
Ubicación: Madrid
Mensajes: 3
Antigüedad: 11 años
Puntos: 0
Respuesta: Sacar estado máximo con dos tablas relacionadas

Gracias por la respuesta. He probado ambas soluciones y ambas salen bien los datos que quiero.

Al final he usado la tuya leonardo_josue.

Muchas Gracias!!

Etiquetas: estado, join, relacionadas, select, sql, 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 15:38.