SQL - нужен запрос, чтобы получить последнее сообщение в каждом потоке, частью которого является пользователь - PullRequest
0 голосов
/ 29 марта 2012

В моем приложении «ветка сообщений» определяется как все сообщения между двумя или более пользователями и не является вложенной.Он должен работать как сообщения Facebook.

Мне нужен запрос, который генерирует список всех «цепочек сообщений», в которых пользователь является участником, отсортированный по темам с самой последней активностью по убыванию.Результатом является таблица отдельных потоков, где каждая строка содержит идентификаторы потоков, postDate и messageBody.

Вот моя схема:

MessageThreads (threadID, lastPostDate)
MessageThreadUsers (threadFK, userFK)
Сообщения (messageID, threadFK, senderFK, postDate, messageBody)
Пользователи (userID, userName, userEmail, ...)

Для начала, этот запрос дает мне все сообщения из всех потоков, в которых находится пользователь:

SELECT * FROM MessageThreadUsers
JOIN Messages ON MessageThreadUsers.threadFK = Messages.threadFK
WHERE MessageThreadUsers.userFK = 'usr_developer'
ORDER BY messageDate DESC

Но как мне получить только самые последние?Я думаю, что я бы использовал функцию MAX (messageDate), но как это работает в JOIN, как это?И как бы я вытащил одну строку с данными сообщения для каждого потока?

Было бы очень полезно, если бы вы могли опубликовать свой ответ в TSQL, но любая помощь приветствуется.Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 марта 2012

Это оказалось не так сложно, как я сначала думал. Поскольку самая последняя дата публикации хранится в ветке, мне не нужно собирать данные в сообщении в таблице сообщений. Вот мой запрос:

SELECT DISTINCT 
    MessageThreadUsers.threadFK, 
    MessageThreads.threadDate, 
    [Messages].MessageBody, 
    [Messages].senderFK,
    Users.userFullName
FROM MessageThreadUsers
JOIN MessageThreads ON MessageThreadUsers.threadFK = MessageThreads.threadID
JOIN Messages ON MessageThreads.threadDate = Messages.messageDate
JOIN Users ON Messages.senderFK = Users.userID
WHERE userFK = 'usr_developer'
0 голосов
/ 29 марта 2012

Если у вас правильный порядок, вы должны получить «лучший удар», добавив:

LIMIT 1
...