I need to get all the conversations from a user including the last date from a message. These are the tables:
Conversation table:
| ConversationId | UserId | Subject |
|---|---|---|
| 5 | 1 | Help |
| 6 | 2 | No data in server |
| 7 | 1 | Server Help |
Message table:
| MessageId | ConversationId | Text | Created |
|---|---|---|---|
| 1 | 5 | Error in.. | 2/2/2020 |
| 2 | 5 | Need help… | 2/3/2020 |
| 3 | 5 | successfully.. | 2/4/2020 |
| 4 | 6 | Help | 2/5/2020 |
| 5 | 7 | server not working | 2/6/2020 |
My result for the conversations for user 1 would be this:
| ConversationId | UserId | Subject | LastCreatedMessageDate |
|---|---|---|---|
| 5 | 1 | Help | 2/4/2020 |
| 7 | 1 | Server Help | 2/6/2020 |
My first option is to do a subquery like:
SELECT
c.conversationId,
c.userid,
c.subject,
(SELECT TOP 1 m.Created
FROM Message as m
WHERE m.conversationId = c.conversationId
ORDER BY MessageId DESC) AS LastCreatedMessageDate
FROM
conversation c
WHERE
c.userid = '1'
Second option would be to use outer apply like:
SELECT
c.conversationId,
c.userid,
c.subject,
m.lastCreatedMessage
FROM
conversation c
OUTER APPLY
(SELECT TOP 1 m.Created AS lastCreatedMessage
FROM Message m
WHERE m.conversationId = c.conversationId
ORDER BY MessageId DESC) m
WHERE
c.userid = '1'
What would be a better way of joining these two tables? Is one query any better than the other? Is there a better option of getting the data maybe with joins?
Thanks!