Consulta de MySQL para crear un "bump-sistema" para un foro que estoy haciendo
-
05-09-2019 - |
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.
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;