Pregunta

Estoy teniendo problemas para formar una base de datos MySQL consulta que realiza la siguiente acción:

Seleccione todos los threadIDs de los hilos de la tabla de pedidos por la marca de tiempo (en orden descendente) de la más reciente post (timestamp mayor) con threadID igual a la sesión de cada subproceso.Así que, básicamente, quiero ir a través de los hilos y han de MySQL, verificación de la base de datos por, digamos, un hilo de 0.A continuación, comprueba todos los mensajes que han de sesión de 0 y tipo thread0 basado en la más grande de la marca de tiempo de los postes dentro de thread0.A continuación, se repite esto para thread1, thread2, etc y los ordena en consecuencia.

Esto es incluso posible?Es para crear el "bump-sistema" efecto del foro, donde el activo más recientemente hilo se dispara a la parte superior de la lista de forma continua hasta que el hilo se muere, luego cae a la parte inferior.Solía usar una implementación diferente de donde he guardado un lastActivity marca de tiempo en los hilos de la tabla y actualizado cuando un nuevo post fue presentado en el hilo, pero esta consulta haría las cosas mucho más eficiente.

Muchas gracias!Hay dos tablas relevantes aquí:temas y mensajes.Los postes tienen una sesión de campo que almacena el IDENTIFICADOR del hilo a la que pertenece, y también tiene un campo de marca de hora.Hilos tiene un campo de sesión que corresponde a la entrada de sesión.

¿Fue útil?

Solución

La siguiente, me ha funcionado en el pasado en MySql.Si desea incluir más acerca de cada hilo en la consulta, usted tendrá que agregar las columnas a la SELECT y el GROUP BY.

select thread.threadID, max(comments.modifiedOn) as threadUpdated 
   from thread inner join comments on thread.threadID = comments.threadID 
   group by 1 
   order by 2 desc;

Esta consulta sirve a su solicitud de primaria, que es una lista de los temas de pedir mi comentario más reciente.No volverá hilos con comentarios como-es, sería necesario para cambiar la combinación de una combinación externa para hacerlo.

Otros consejos

SELECT  *
FROM    threads t
LEFT JOIN
        posts p
ON      p.id =
        (
        SELECT  p.id
        FROM    posts pi
        WHERE   pi.threadID = t.threadID
        ORDER BY
                pi.timestamp DESC
        LIMIT 1
        )

Tener un índice en posts (threadID, timestamp) mejorará a esta consulta.

Tenga en cuenta que a diferencia de GROUP BY soluciones, esta consulta también se seleccionan todos los campos de posts y funciona incluso si usted tiene duplicados en la última posts.timestamp.

SELECT t.*, p1.`timestamp`
FROM threads t 
  JOIN posts p1 ON (p1.threadid = t.id)
  LEFT JOIN posts p2 ON (p2.threadid = t.id 
    AND p1.`timestamp` < p2.`timestamp`)
WHERE p2.threadid IS NULL
ORDER BY p1.`timestamp` DESC;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top