2011-02-01 1 views
0

я делаю какую-то работу для отдела, который имеет довольно базовую структуру таблицы установить на свои форумы в базе данных MySQL:MySQL Query: Получение Последнего сообщения в форуме

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

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) 

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

Так что эти поля я пытаюсь SELECT:
Категория Имя
Id Категория
Заголовок темы
Thread ID
Сообщение идентификатор последнего добавленного сообщения в этой теме
сообщение текст последнего добавленного сообщения к этому потоку
Идентификатор пользователя автора самого последнего добавленного сообщения к этой теме
Имя пользователя пользователя, недавно добавленное к этому сообщению
Время, когда последнее сообщение было отправлено

Его можно заказать по последнему действию потока.

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

Спасибо!

+0

Я не вижу никаких столбцов-кандидатов для связи категории -> thread -> post. Каковы ваши отношения с внешним ключом? –

+0

О, человек. Сожалею. Я оставил это ... Тема category_id ссылается на таблицу категорий, а thread_id ссылается на таблицу потоков. Надеюсь, что поможет. Спасибо (я отредактировал сообщение выше). – SqlSoul

ответ

1

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

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 

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

+0

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

+0

@ pixel87 Я отредактировал свой ответ, так что он должен соответствовать вашим потребностям сейчас (по крайней мере, как я понимаю). Если этого не произойдет, выборочные данные будут полезны. – fancyPants