MySQL Query для создания «бамп-системы» для форума, который я создаю.

StackOverflow https://stackoverflow.com/questions/726472

  •  05-09-2019
  •  | 
  •  

Вопрос

У меня возникли проблемы с формированием запроса MySQL, который выполняет следующее действие:

Выберите все идентификаторы потоков из таблицы потоков, упорядочив их по метке времени (в порядке убывания) самого последнего сообщения (самая большая метка времени) с идентификатором потока, равным идентификатору потока каждого потока.Итак, по сути, я хочу просмотреть потоки и заставить MySQL проверить базу данных, скажем, на поток 0.Затем он проверяет все сообщения с идентификатором threadID, равным 0, и сортирует поток thread0 по наибольшей временной метке сообщений внутри потока0.Затем он повторяет это для потока1, потока2 и т. д. и сортирует их соответствующим образом.

Возможно ли это вообще?Целью этого форума является создание эффекта «бамп-системы», при котором последняя активная тема постоянно перемещается вверх списка, пока тема не затухает, а затем опускается вниз.Раньше я использовал другую реализацию, в которой я сохранял временную метку LastActivity в таблице потоков и обновлял ее, когда в поток отправлялось новое сообщение, но этот запрос сделал бы работу намного более эффективной.

Большое спасибо!Здесь актуальны две таблицы:темы и сообщения.Сообщения имеют поле threadID, в котором хранится идентификатор потока, к которому они принадлежат, а также поле метки времени.В Threads есть поле threadID, соответствующее threadID сообщения.

Это было полезно?

Решение

В прошлом на MySql у меня работало следующее.Если вы хотите включить дополнительную информацию о каждом потоке в запрос, вам придется добавить столбцы в SELECT и 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;

Этот запрос обслуживает ваш основной запрос, который представляет собой список тем, упорядоченных по моему последнему комментарию.Он не будет возвращать темы без комментариев как есть, для этого вам нужно будет изменить соединение на внешнее соединение.

Другие советы

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
        )

Наличие индекса на posts (threadID, timestamp) значительно улучшит этот запрос.

Обратите внимание, что в отличие от GROUP BY решения, этот запрос также выбирает все поля из posts и работает, даже если у вас есть дубликаты в последней версии 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top