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

SQL complicada

Estas en el tema de SQL complicada en el foro de Bases de Datos General en Foros del Web. Buenos días. Miren, tengo este problema con el foro que estoy construyendo. Estas son las tres tablas: Categorias: IdCategoria, Nombre Hilos: IdHilo, IdCategoria (Relaciona con ...
  #1 (permalink)  
Antiguo 21/07/2006, 15:59
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
SQL complicada

Buenos días.
Miren, tengo este problema con el foro que estoy construyendo.
Estas son las tres tablas:

Categorias: IdCategoria, Nombre
Hilos: IdHilo, IdCategoria (Relaciona con Categorias)
Mensajes: IdMensaje, Titulo, ..., FechaHora, IdHilo (Relaciona con Hilos)

Tengo problemas para construir la select que necesito.
La cosa seria, para una Categoria en concreto, obtener los datos del primer Mensaje de cada Hilo, pero ordenados por la FechaHora del Ultimo mensaje del Hilo.
El primer mensaje me refiero al que tiene la FechaHora menor, y el último al que tiene la FechaHora mayor, que es por el que deben salir ordenados los registros.
Deberían salir tantos registros como hilos existan, pero con la estructura de la tabla Mensajes.
Espero haberme explicado bien y alguien pueda echarme una mano.
Muchas gracias y un saludo!
__________________
..:: moNTeZIon ::..
  #2 (permalink)  
Antiguo 21/07/2006, 17:19
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Código:
Declare @IdCategoria int
Set @IdCategoria = 1

Select     T.* 
from       #tmpHilo H  (nolock)
Inner join #tmpMensaje T (nolock)
On         H.IdHilo = T.IdHilo
Inner join
          (Select IdHilo, min(FechaHora) FechaHora from #tmpMensaje(nolock)  Group by IdHilo) S
On        T.IdHilo = S.IdHilo And T.FechaHora = S.FechaHora
Where     H.IdCategoria = @IdCategoria
  #3 (permalink)  
Antiguo 21/07/2006, 17:29
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
Uff, vale. Olvidé un detalle. Es para Access.
Gracias por responder Andres95!
Es posible conseguirlo en SQL para Access?
Perdonen que pregunte aqui pero no encontré un foro más adecuado.
Gracias!
__________________
..:: moNTeZIon ::..
  #4 (permalink)  
Antiguo 24/07/2006, 08:23
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Pon especial atencion a los parentesis cuadrados y el punto que tiene el subquery, para que access lo reconozca como tal...

espero te sirva....



Código:
SELECT Mensaje.*
FROM Hilo INNER JOIN (Mensaje INNER JOIN [Select IdHilo, min(FechaHora) AS  minimafecha from Mensaje  Group by IdHilo]. AS Minimo ON (Minimo.IdHilo=Mensaje.IdHilo) AND (Mensaje.FechaHora=Minimo.minimafecha)) ON Hilo.IdHilo=Mensaje.IdHilo
WHERE (((Hilo.IdCategoria)=1));

un saludo.
  #5 (permalink)  
Antiguo 25/07/2006, 16:37
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Movido a DB generales.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #6 (permalink)  
Antiguo 18/08/2006, 20:30
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
Hola de nuevo,
He estado probando tu código SQL Andrés. Me queda así:
Código:
SELECT ForoMensajes.* FROM ForoHilos INNER JOIN (ForoMensajes INNER JOIN [SELECT IdHilo, MIN(FechaHora) AS MinimaFecha FROM ForoMensajes Group by IdHilo]. AS Minimo ON (Minimo.IdHilo=ForoMensajes.IdHilo) AND (ForoMensajes.FechaHora=Minimo.MinimaFecha)) ON ForoHilos.IdHilo=ForoMensajes.IdHilo WHERE (((ForoHilos.IdCategoria)=?))
Me devuelve los registros correctos. Pero el orden en que me los devuelve es:

FechaHora del primer mensaje del Hilo, Ascendende.

Y yo necesito:

FechaHora del ultimo mensaje del Hilo, Descendente.

Eso si, los mismos datos que me devuelve tu consulta, los del primer Mensaje de cada Hilo.

Ahora mismo lo que hago es recorrer todos los mensajes de la categoria, ordenados por FechaHora Descendente, y me voy guardando los IdHilo en un array, sin repetirlos.
Luego, por cada Hilo guardado en el array, voy recuperando los datos del primer mensaje del Hilo y construyendo un conjunto de datos que devuelvo finalmente.
Quisiera ahorrarme el primer paso (recorrer todos los mensajes de la categoria para obtener el orden de los hilos) a través de una SQL que me devuelva directamente los registros que necesito, ordenados como digo, si es posible.
Gracias por la ayuda!
Un saludo.
__________________
..:: moNTeZIon ::..
  #7 (permalink)  
Antiguo 21/08/2006, 09:41
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
la verdad no entiendo la ordenacion que requieres.
  #8 (permalink)  
Antiguo 21/08/2006, 16:06
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
Ok, pues me explico un poquito más.
Para hacer una idea, es algo estilo el indice de hilos de Foros del Web, cuando entras en un foro. Aparece un listado de "hilos", mostrando datos del primer mensaje de cada "hilo" (titulo del asunto que le puso quien lo creó, Nombre del Autor, Numero de Respuestas, etc...), pero eso si, salen ordenados descendentemente por el ultimo mensaje de cada hilo. Así, si respondo un hilo, seguidamente aparecerá como primer hilo otra vez, porqué tiene una respuesta más nueva ese hilo.
Por decirlo de alguna forma, el criterio de ordenación no está en esos registros de vuelta, porqué son los primeros mensajes de cada hilo (estos solo son los que se muestran), el criterio de ordenación sería la FechaHora del ultimo mensaje del mismo hilo. Por ejemplo, en caso que un hilo solo conste de un mensaje, en este caso tanto el primer mensaje del hilo como el último son el mismo.
Bueno, no se si me expliqué mejor ahora, espero que si.
Gracias Andres y a los demás.
Un saludo.
__________________
..:: moNTeZIon ::..

Última edición por moNTeZIon; 24/08/2006 a las 02:44
  #9 (permalink)  
Antiguo 25/08/2006, 05:29
Avatar de macedo  
Fecha de Ingreso: enero-2002
Ubicación: Madrid
Mensajes: 124
Antigüedad: 22 años, 3 meses
Puntos: 0
Hola moNTeZIon.

Si no te he entendido mal, los que quieres es que te salgan los mensajes ordenados de la siguiente manera:

Primer y ultimo mensaje de cada hilo, ordenando los hilos en función del mensaje más reciente de cada uno (para un categoría X)

O sea, el tipico listado de hilos de una categoría ¿no?

Si esto es así, te debería servir esta Query:

Select T1.* from ForoMensajes as t1,
(select idHilo,Max(fechaHora) as Ma, Min(fechaHora) as Mi from ForoMensajes group by Idhilo order by Ma) as T2, Hilos
where T1.IdHilo=T2.IdHilo and (T1.FechaHora=T2.Ma or T1.FechaHora=T2.Mi)
and T1.IdHilo=Hilos.IdHilo and T2.IdHilo=Hilos.IdHilo and Hilos.IdCategoria=x
order by T2.Ma Desc, T1.FechaHora Asc

Me explico:
(select idHilo,Max(fechaHora) as Ma, Min(fechaHora) as Mi from ForoMensajes group by Idhilo order by Ma Desc) as T2

Te extrae para cada hilo su idhilo, la fechahora mínima y máxima.
Con esto, si ordernas el resultado total por T2.Ma ya tienes ordenados los mensajes por los hilo con mensaje más reciente.

(T1.FechaHora=T2.Ma or T1.FechaHora=T2.Mi)
Esta condición hace que en el resultdo te salgan sólo el primer y último mensaje de cada hilo

Como sub order pones t1.fechahora (osea que dentro de los dos mensajes que te salen por hilo los ordena por fecha.

Espero que te sirva.

Un saludo.
__________________
"Hay que simplificar las cosas tanto como sea posible, pero no más".
Albert Einstein.
  #10 (permalink)  
Antiguo 25/08/2006, 05:46
Avatar de macedo  
Fecha de Ingreso: enero-2002
Ubicación: Madrid
Mensajes: 124
Antigüedad: 22 años, 3 meses
Puntos: 0
Por cierto, si sólo queires el primero de cada hilo, sólo cambia:

(T1.FechaHora=T2.Ma or T1.FechaHora=T2.Mi)

Por

T1.FechaHora=T2.Mi

Pero me imagino que quieres tambien el último para poner en la lista la fecha de la ultima respuesta del hilo.

Otra cosa.

No me acordaba de que es Access. Tienes que cambiar

(select idHilo,Max(fechaHora) as Ma, Min(fechaHora) as Mi from ForoMensajes group by Idhilo order by Ma)

Por

(select idHilo,Max(fechaHora) as Ma, Min(fechaHora) as Mi from ForoMensajes group by Idhilo order by Max(fechaHora))
Un saludo.
__________________
"Hay que simplificar las cosas tanto como sea posible, pero no más".
Albert Einstein.

Última edición por macedo; 25/08/2006 a las 05:58
  #11 (permalink)  
Antiguo 25/08/2006, 05:58
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
Gracias men!
Eso tiene buena pinta.
Ahora mismo no puedo probar, en cuanto lo tenga delante ya os cuento.
Muchas gracias por la ayuda.
Saludos.
__________________
..:: moNTeZIon ::..
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 19:01.