MySQL Query: получение самой последней публикации на форуме - PullRequest
0 голосов
/ 01 февраля 2011

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

Каждый пост принадлежит потоку, а каждый поток принадлежит категории.Существует также таблица пользователей с информацией об авторе.

TABLE category:
id (int)
name (varchar)

TABLE thread:
id (int)
category_id (int)
user_id ((int)
title (varchar)
last_post (int) -- logs a unix timestamp of the last posts insertion

TABLE post:
id (int)
user_id (int)
thread_id (int)
post (longtext)
timestamp (int)

TABLE users:
id (int)
username (varchar)

Я пытаюсь создать страницу, на которой будут отображаться все темы, в которых пользователь разместил сообщение (только один раз, поэтому, если пользователь опубликовал intветку 3 раза она все равно должна отображаться в списке только один раз), а самая последняя запись добавлена ​​в каждую из этих тем.

Итак, вот поля, которые я пытаюсь выбрать:
Имя категории
Идентификатор категории
Название темы
Идентификатор темы
Идентификатор последнего добавленного сообщенияв эту ветку
Текст самого последнего добавленного сообщения в эту ветку
Идентификатор автора самого последнего добавленного сообщения в эту ветку
Имя автора последнего добавленного в эту ветку сообщения
Время, когда было добавлено последнее добавленное сообщение

Оно может быть упорядочено по самой последней активности потока.

Возможно ли это в одном запросе?Очевидно, что способ упростить это - запросить все темы, в которых пользователь разместил сообщение, а затем отправить отдельный запрос для каждой из них, чтобы получить самую последнюю добавленную информацию о сообщении.

Спасибо!

1 Ответ

1 голос
/ 01 февраля 2011

Не проверено, но это должно быть сделано:

SELECT DISTINCT
c.name
, c.id
, t.title
, t.id
, p.id
, p.post
, u.id
, u.username
, FROM_UNIXTIME(p.`timestamp`) AS postDate
FROM
category c
INNER JOIN thread t ON t.category_id = c.id
INNER JOIN post p ON p.thread_id = t.id
INNER JOIN users u ON u.id = p.user_id
INNER JOIN users u2 ON u2.id = p.user_id
WHERE
u2.id = userID_whose_threads_are_to_display
AND p.timestamp = (SELECT MAX(`timestamp`) FROM post WHERE post.thread_id = p.thread_id)
ORDER BY postDate DESC

Обратите внимание, что имхо плохая идея именовать столбец как тип данных (временная метка в вашем случае, поэтому я помещаю ее в ``).

...