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

Problema en orden GROUP

Estas en el tema de Problema en orden GROUP en el foro de Mysql en Foros del Web. Hola, estoy creando un foro. En la tabla hilos tengo el título, fecha de creación e info sobre el foro al que pertenece. En la ...
  #1 (permalink)  
Antiguo 31/03/2008, 06:15
 
Fecha de Ingreso: enero-2004
Mensajes: 207
Antigüedad: 20 años, 3 meses
Puntos: 1
Problema en orden GROUP

Hola,

estoy creando un foro. En la tabla hilos tengo el título, fecha de creación e info sobre el foro al que pertenece. En la tabla posts, tengo todos los posts que la gente va escribiendo.

Pues bien lo que quiero es simplemente mostrar la lista de hilos ordandas por la fecha de los posts que forman parte de cada hilo. Es decir lo que hace cualquier foro normal que aparece primero el hilo en el que se ha escrito el último comentario.

Tengo:

SELECT * FROM posts, hilos WHERE id_hilo = id_hilo_post GROUP BY id_hilo ORDER BY date_post DESC

y lo que pasa es me sigue apareciendo primero el último hilo aunque un hilo más viejo tenga un post más reciente

Si quito el GROUP BY, sí que me ordena por la fecha de los posts, pero claro, no me agrupa y si por ejemplo tengo 3 hilos, me aparecen tantos como post existan.

En definitiva necesito que me agrupe por hilo pero ordene por post, pero no en cada grupo, que parece que es lo que hace, sino como orden global del select.

Gracias
  #2 (permalink)  
Antiguo 31/03/2008, 06:21
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, 5 meses
Puntos: 2658
Re: Problema en orden GROUP

Código:
SELECT * 
FROM posts, hilos 
INNER JOIN ON id_hilo = id_hilo_post 
GROUP BY date_post, id_hilo 
ORDER BY date_post DESC
  #3 (permalink)  
Antiguo 31/03/2008, 06:38
 
Fecha de Ingreso: enero-2004
Mensajes: 207
Antigüedad: 20 años, 3 meses
Puntos: 1
Re: Problema en orden GROUP

muchas gracias, pero me da error. Si lo cambio por

Código:
SELECT * 
FROM posts INNER JOIN hilos 
ON id_hilo = id_hilo_post 
GROUP BY date_post, id_hilo
ORDER BY date_post DESC
no me da error, pero de esta forma me aparecen tantos hilos como posts, tengo (lo mismo que me pasaba a mí quitanto el GROUP BY).

si quito date_post del GROUP BY que me has pasado, entonces me queda la cosa como mi primer ejemplo, es decir digamos que el INNER JOIN no hace que cambie nada.

Alguna sujerencia? gracias
  #4 (permalink)  
Antiguo 31/03/2008, 07:53
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, 5 meses
Puntos: 2658
Re: Problema en orden GROUP

Para resolver este problema, no puedes hacer un SELECT *, ya que debes controlar los campos reales que van aa aparecer.
Si lo que necesitas es un detalle de sólo el primero, hay que hilar fino los campos:
Código:
SELECT 
    titulo_hilo AS 'TEMA', 
    date_hilo AS CREADO, 
    titulo_post AS 'RESPUESTA', 
    MAX(date_post) as 'ULTIMO POST'
FROM posts INNER JOIN hilos
ON id_hilo = id_hilo_post 
GROUP BY id_hilo
ORDER BY date_post DESC
El INNER JOIN es para que los optimizadores de los índices funcionen correctamente. Es el modo de hacer esa relación entre campos y pertenece al estandar de SQLdesde hace años. Poner esa selección el el WHERE no le permite a MySQL hacer una buena optimización.
Lo vas a percibir ante el crecimiento de las tablas.
  #5 (permalink)  
Antiguo 31/03/2008, 11:04
 
Fecha de Ingreso: enero-2004
Mensajes: 207
Antigüedad: 20 años, 3 meses
Puntos: 1
Re: Problema en orden GROUP

gracias por la info, procuraré utilizar INNER JOIN en lugar de SELECT normales con WHERE para optimizar los resultados.

A propósito y cómo se utilizaría INNER JOIN cuando son 3 o más tablas, en lugar de 2?
  #6 (permalink)  
Antiguo 31/03/2008, 11:44
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, 5 meses
Puntos: 2658
Re: Problema en orden GROUP

El uso de INNER JOIN, lo mismo que todos los JOIN lo puedes consultar con detalle en 13.2.7.1. Sintaxis de JOIN.
En el caso de las combinaciones de múltiples tablas, debes fijarte bien cuál es el conjunto de datos que va quedando en cada JOIN, por si una parte de ese conjunto es necesaria para el segundo JOIN y surge de la combinatoria de las dos primeras.
A veces quedan más claros cuando se hacen en subconsultas. Además las subconsultas te permiten acotar los datos por segmentos, acelerando el proceso.

Un ejemplo sería:
Código:
SELECT T1.Campo1, T2.Campo2, T2.Campo3, T3.Campo1 
FROM Tabla1 T1 
INNER JOIN Tabla2 T2 USING(Campo1) 
INNER JOIN Tabla3 T3 ON T2.Campo3 = T3.Campo2;
En este caso utilicé USING() en vez de ON, porque los campos de ambas tablas (1 y 2) se llaman igual. El ON X1 = X2 se usa cuando los campos X1 y X2 tienen diferentes nombres.
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 07:07.