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

Problema con subconsulta aparentemente sencilla

Estas en el tema de Problema con subconsulta aparentemente sencilla en el foro de Mysql en Foros del Web. Buenos dias, Llevo varios dias intentando solucional una consulta aparentemente sencilla, pero no encuentro la solucion, si alguien puede ayudarme estaria muy agradecido... La cuestion ...
  #1 (permalink)  
Antiguo 16/12/2011, 04:42
 
Fecha de Ingreso: octubre-2010
Mensajes: 10
Antigüedad: 9 años, 1 mes
Puntos: 1
Problema con subconsulta aparentemente sencilla

Buenos dias,
Llevo varios dias intentando solucional una consulta aparentemente sencilla, pero no encuentro la solucion, si alguien puede ayudarme estaria muy agradecido...

La cuestion es:

Tengo una tabla principal con unos expedientes, y una tabla secundaria con los status de cada uno de los expedientes, o sea que cada expediente tiene varios estatus que se pueden ordenar por fecha o codigo autonumerico.
Lo que no consigo hacer es una consulta que muestre todos los expedientes, con el ULTIMO estatus. He probada varias sentencias (MAX, LAST, INNER JOIN, etc) pero no encuentro la forma correcta.

Muchas gracias por adelantado a todos los que me puedan ayudar
  #2 (permalink)  
Antiguo 16/12/2011, 05:44
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.321
Antigüedad: 12 años
Puntos: 2653
Respuesta: Problema con subconsulta aparentemente sencilla

Sería más sencillo que postearas las consultas que no te están resultando, para ver por qué tienes problemas usando MAX() e INNER JOIN (no conozco ninguna cláusula LAST en MySQL).
Eventualmente es posible que necesitemos saber cómo son las tablas, pero para empezar necesitamos las consultas, porque las razones del error pueden ser muchas.
Lo que nos daría alguna ayuda es saber cómo son los datos que determinan el orden histórico: ¿fechas?, ¿Ids numéricos?
__________________
¿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 19/12/2011, 04:08
 
Fecha de Ingreso: octubre-2010
Mensajes: 10
Antigüedad: 9 años, 1 mes
Puntos: 1
Respuesta: Problema con subconsulta aparentemente sencilla

Ante todo muchas gracias por tu respuesta...

La consulta es la siguiente:

SELECT *, TO_DAYS(curdate())-TO_DAYS(status2.fechahora) AS dif, TO_DAYS(curdate())-TO_DAYS(expedients.datarecepcio) AS dif2
FROM expedients INNER JOIN (SELECT * FROM status
WHERE status = 'parametro' ORDER BY fechahora DESC) AS status2
ON expedients.codexpedient = status2.codexpedient GROUP BY expedients.codexpedient

Te cuento con mas detalle...
Como puedes ver tengo unas funciones para saber los días que han transcurrido entre algunas fechas de la consulta y la fecha actual, y hasta aquí todo bien, lo que pasa es que me muestra todos los registros de expedientes, y lo que no consigo es que solo muestre los expedientes cuyo ultimo registro en status sea el parametro de la clausula Where

La estructura basica (tiene muchos campos) de las tablas son las siguientes:

EXPEDIENTS
codexpedient int(11) NOT NULL auto_increment,
datarecepcio date NOT NULL,
cognom1tit varchar(100) NOT NULL,
cognom2tit varchar(100) NOT NULL,
nomtit varchar(100) NOT NULL,
CIPtit varchar(30) NOT NULL,
DNItit varchar(20) NOT NULL,
datanaixementtit date NOT NULL,
tiene muchos mas campos...

STATUS
codstatus int(11) NOT NULL auto_increment,
codexpedient varchar(100) NOT NULL,
status varchar(150) NOT NULL,
titoltextepredefinit text,
fechahora timestamp NOT NULL,

Tengo la sensación que se me escapa algo y que tiene que ser sencillo, pero llevo demasiado tiempo dandole vueltas y necesito otros puntos de vista...
Muchisimas gracias por adelantado
  #4 (permalink)  
Antiguo 19/12/2011, 05:38
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.321
Antigüedad: 12 años
Puntos: 2653
Respuesta: Problema con subconsulta aparentemente sencilla

¿Probaste algo así?:

Código MySQL:
Ver original
  1.     *,
  2.     TIMESTAMPDIFF(DAY, S.fechahora, CURDATE())  dif,
  3.     TIMESTAMPDIFF(DAY, E.datarecepcio, CURDATE()) dif2
  4.     expedients E
  5.     INNER JOIN
  6.         (SELECT codstatus, codexpedient, status, titoltextepredefinit, MAX(fechahora) datarecepcio,  
  7.         FROM status
  8.         WHERE status = 'parametro'
  9.         GROUP BY codexpedient) S ON E.codexpedient = S.codexpedient
  10. GROUP BY E.codexpedient

Cambié la formula que usas para hacer el cálculo,porque ya existe un a función más eficiente para eso (TIMESTAMPDIFF()).
Un tip que te agregaría es que no es buena práctica usar el asterisco para las consultas, a menos que efectivamente estés por usar luego todos los datos de todas las columnas de las tablas leídas... que no es aparentemente el caso.
Traer todo recarga inútilmente el proceso, las comunicaciones y requiere más memoria del buffer de datos. A menos que sea absolutamente necesario, indica específicamente qué campos vas a usar y el resto no los pongas.
Es preferible perder tiempo tipeando nombres, y no perder perfomance.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 19/12/2011 a las 05:43
  #5 (permalink)  
Antiguo 19/12/2011, 10:15
 
Fecha de Ingreso: octubre-2010
Mensajes: 10
Antigüedad: 9 años, 1 mes
Puntos: 1
Respuesta: Problema con subconsulta aparentemente sencilla

Muchas gracias por tu respuesta y comentarios. Estoy haciendo las pruebas y te digo algo mas tarde...

Gracias de nuevo
  #6 (permalink)  
Antiguo 20/12/2011, 04:30
 
Fecha de Ingreso: octubre-2010
Mensajes: 10
Antigüedad: 9 años, 1 mes
Puntos: 1
Respuesta: Problema con subconsulta aparentemente sencilla

Hola otra vez, llevo horas haciendo combinaciones en base a la info que has enviado, pero no me salgo...

La función TIMESTAMPDIF es para PHP5 y yo tengo la BD con PHP4, pero ese no es el problema porque en esta version existe la función DATE_ADD que aparentemente es lo mismo. Pero el problema no lo tengo por ahí, sino en el SELECT.
Con la siguiente sentencia consigo que me muestre el ultimo codstatus (con la función MAX(codstatus) de cada expediente, pero el campo status no es el ultimo sino el primero y no se como hacer para extraer el campo status que coincida con el codstatus.

SELECT MAX(codstatus), MAX(fechahora), expedients.codexpedient, status
FROM status
INNER JOIN expedients ON expedients.codexpedient = status.codexpedient
GROUP BY status.codexpedient

Como puedes ver he simplificado la consulta par centrarla en el problema

Una vez mas gracias por tu ayuda
  #7 (permalink)  
Antiguo 20/12/2011, 06:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.321
Antigüedad: 12 años
Puntos: 2653
Respuesta: Problema con subconsulta aparentemente sencilla

Cita:
La función TIMESTAMPDIF es para PHP5 y yo tengo la BD con PHP4, pero ese no es el problema porque en esta version existe la función DATE_ADD que aparentemente es lo mismo. Pero el problema no lo tengo por ahí, sino en el SELECT.
Por si no lo has notado, la función TIMESTAMDIFF() invocada no es de PHP, es de MySQL, por lo que no aplica la restricción de PHP 4 ó 5. En tanto la versión de MySQL sea 5.0.x o superior, la función indicada en la consulta tiene que funcionar si o sí.
No confundas el SQL con el PHP, son lenguajes de orientación y uso completamente diferentes.
Cita:
pero el campo status no es el ultimo sino el primero y no se como hacer para extraer el campo status que coincida con el codstatus.
Bueno, para que te devuelva eso, dime primero: ¿qué es lo que determina que un status sea el último?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 20/12/2011, 09:28
 
Fecha de Ingreso: octubre-2010
Mensajes: 10
Antigüedad: 9 años, 1 mes
Puntos: 1
Respuesta: Problema con subconsulta aparentemente sencilla

Es verdad disculpa, me he liado y confundido con MySQL y PHP al escribir, la versión de MySQL es 4.1

El campo que determina que status es el ultimo, puede ser uno los dos, Max(status) o MAX(fechahora), lo que no entiendo es porque no me muestra el status del registro correspondiente a MAX(status) o MAX(fechahora) da igual cual se utilice pues siempre sera el ultimo registro.

Gracias por adelantado y por tu paciencia
  #9 (permalink)  
Antiguo 20/12/2011, 10:36
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.321
Antigüedad: 12 años
Puntos: 2653
Respuesta: Problema con subconsulta aparentemente sencilla

Pregunta: ¿Por qué estás usando una versión de MySQL obsoleta? ¿Es algún requerimiento del cliente?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 20/12/2011, 11:28
 
Fecha de Ingreso: octubre-2010
Mensajes: 10
Antigüedad: 9 años, 1 mes
Puntos: 1
Respuesta: Problema con subconsulta aparentemente sencilla

El problema es que en el servidor hay varias aplicaciones mas que no se pueden parar, y prefieren no arriesgar con cambios...
  #11 (permalink)  
Antiguo 20/12/2011, 12:54
Avatar de leo_  
Fecha de Ingreso: abril-2008
Mensajes: 40
Antigüedad: 11 años, 7 meses
Puntos: 11
Sonrisa Respuesta: Problema con subconsulta aparentemente sencilla

Hola investigando un poco me parece que la consulta quedaria asi:
Código SQL:
Ver original
  1. SELECT t1.codexpedient, t4.STATUS
  2. FROM expedients t1
  3. LEFT JOIN (
  4.            SELECT codexpedient, `status`
  5.            FROM `status` t2
  6.            WHERE fechahora = (
  7.                               SELECT MAX( fechahora )
  8.                               FROM `status` t3
  9.                               WHERE t2.codexpedient = t3.codexpedient
  10.                               )
  11.            ) t4
  12. ON t1.codexpedient = t4.codexpedient
Eso lo saque de [URL]"http://dev.mysql.com/doc/refman/4.1/en/example-maximum-column-group-row.html"[/URL] funciona por lo menos en mi instalación de MySQL 5.5. Espero haber sido de ayuda. Saludos.
__________________
Di que no haces las cosas para que te las agradezcan, pero trata de hacerlas para gente agradecida. Cipriano.

Última edición por leo_; 20/12/2011 a las 13:04 Razón: Por alguna extraña razón no funca el bb code url para mi òó
  #12 (permalink)  
Antiguo 20/12/2011, 14:14
 
Fecha de Ingreso: octubre-2010
Mensajes: 10
Antigüedad: 9 años, 1 mes
Puntos: 1
Respuesta: Problema con subconsulta aparentemente sencilla

Ok funciona...

Muchisimas gracias a todos

Etiquetas: join, sencilla, subconsulta, 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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 11:13.