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

Ordenando posts por última respuesta

Estas en el tema de Ordenando posts por última respuesta en el foro de Mysql en Foros del Web. Hola amigos, en el foro que yo programé tengo un bloque en el que se muestran las 10 últimas respuestas que se han enviado, el ...
  #1 (permalink)  
Antiguo 01/09/2008, 21:34
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 19 años, 2 meses
Puntos: 4
Ordenando posts por última respuesta

Hola amigos, en el foro que yo programé tengo un bloque en el que se muestran las 10 últimas respuestas que se han enviado, el bloque se muestra de esta forma:



Como pueden ver, la cosa funciona bien, pero si algún thread recibe más de 1 respuesta estas van apareciendo en dicha lista, pero quisiera hacer algo para que sólo se muestren las últimas respuestas pero que de los ultimos 10 threads en recibir respuestas muestre sólo la última enviada, de modo que no aparezcan más de 1 enlace por thread, no sé si me dejo entender, por ej. si el thread con ID 500 recibe 2 respuestas que sólo aparezca la última que se envió.

Actualmente la consulta con la que funciona la lista que puse en la imagen es la siguiente:

Código PHP:
$query mysql_query("SELECT fr.id_post, fr.titulo, fr.categoria, fr.seccion, fc.id_rpta, fc.id_post, UNIX_TIMESTAMP(fc.fecha) AS fechas, fc.idautor, fc.autor FROM foros fr, fororesp fc WHERE fr.id_post = fc.id_post AND fr.seccion<>'Zona X' ORDER BY fc.fecha DESC LIMIT 0, 10") or die(mysql_error()); 
En el foro de PHP me dijeron que usara GROUP BY para obtener lo que necesito pero al agrupar por fc.id_foro, me devuelve las primeras respuestas enviadas.

Mi pregunta sería, dónde podría modificar para que sólo aparezca la última respuesta por cada thread; agradezco de antemano la ayuda.

Saludos.
  #2 (permalink)  
Antiguo 02/09/2008, 03:34
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Ordenando posts por última respuesta

Te hago la propuesta y te la explico (seguramente haya otras).

Cita:
SELECT t.id, t.titulo, t1.fechapost, r.autor, r.texto
FROM thread t
INNER JOIN respuestas r ON t.id = r.refidthread
INNER JOIN (

SELECT refidthread, max( fecha ) fechapost
FROM `respuestas`
GROUP BY refidthread
ORDER BY max( fecha ) DESC
LIMIT 10
)t1 ON ( t.id = t1.refidthread
AND t1.fechapost = r.fecha )
ORDER BY t1.fechapost DESC
Lo primero es averiguar las fechas más recientes de los thread. Para eso agrupo por refidthread de la tabla que he llamado respuestas (los posts), sacando el máximo valor de fecha de cada post, ordenando descendentemente por esa fecha y limitando a 10.

SELECT refidthread, max( fecha ) fechapost
FROM `respuestas`
GROUP BY refidthread
ORDER BY max( fecha ) DESC
LIMIT 10

Luego mediante inner join de las dos tablas y también con ese resultado, busco todos los datos de thread y respuestas, relacionando por el id del thread y por la fecha (recuerda que es la máxima para cada thread). Cruza las tablas y me trae los datos de las que coinciden con lo sacado en la consulta primera.

Última edición por jurena; 02/09/2008 a las 04:02
  #3 (permalink)  
Antiguo 02/09/2008, 10:25
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 2 meses
Puntos: 45
Respuesta: Ordenando posts por última respuesta

Aquí tambien te puse un respuesta revísalo

http://www.forosdelweb.com/f18/orden...puesta-620583/

Saludos!
__________________
"El conocimiento nos hace responsables."
twitter: @benjamingb
blog personal: http://codigolinea.com
ZF Manual en español http://manual.zfdes.com
  #4 (permalink)  
Antiguo 02/09/2008, 22:10
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 19 años, 2 meses
Puntos: 4
Respuesta: Ordenando posts por última respuesta

Gracias jurena. Hoy en la tarde pensé que ya estaba del todo resuelto pero acabo de darme cuenta de algo, en mi anterior consulta SQL tenía una claúsula WHERE que evitaba que se muestren los threads de la seccion "Zona X", y en tu consulta he intentado añadir dicho WHERE antes de ORDER BY t1.fechapost DESC pero ya no muestra los 10 últimos threads sino menos, también intenté añadir LIMIT 0,10 al final pero tampoco funciona, en qué parte debo añadir ese WHERE?, el campo seccion es de la tabla threads.

Gracias por tu ayuda.

Saludos.
  #5 (permalink)  
Antiguo 03/09/2008, 01:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Ordenando posts por última respuesta

Subseven,
he imaginado que el campo zona lo tienes en lo que yo he llamado thread. Yo lo he puesto como numérico.
En ese caso, dentro de la selección del máximo he hecho esto:

...
(SELECT refidthread, max( fecha ) fechapost
FROM `respuestas`
INNER JOIN thread ON thread.id = respuestas.refidthread
WHERE thread.zona <>1
GROUP BY refidthread
ORDER BY max( fecha ) DESC
LIMIT 10 )t1
...

y parece funcionar, aunque tendrás que hacer pruebas. Si te salen menos de 10, es que hay menos de 10, puesto que has establecido una condición que podría limitarlo, aunque por lo que dices no debe ser el caso, al haber muchos registros de las otras zonas. Pruébalo.
  #6 (permalink)  
Antiguo 03/09/2008, 14:02
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Ordenando posts por última respuesta

Con los datos de tus campos, esta sería la propuesta:
Cita:
SELECT t.id_foro, t.titulo, t.categoria, t.seccion, UNIX_TIMESTAMP( t1.fecha ) AS fechas, r.id_resp, r.autor
FROM foros t
INNER JOIN fororesp r ON t.id_foro = r.id_foro
INNER JOIN (

SELECT fr.id_resp, f.id_foro, MAX( fr.fecha ) fecha
FROM fororesp fr
INNER JOIN foros f ON f.id_foro = fr.id_foro
WHERE f.seccion <> 'Zona X'
GROUP BY id_foro
ORDER BY MAX( fr.fecha ) DESC
LIMIT 0 , 10
)t1 ON ( t.id_foro = t1.id_foro
AND t1.fecha = r.fecha )
ORDER BY t1.fecha DESC
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 12:24.