【发布时间】:2018-08-17 15:46:11
【问题描述】:
我正在尝试为 SQL 中的一组对话识别对话中发送的最后一条消息。我可以取回正确的用户和 ID 没问题,但最后一条消息和发送的时间对于两个对话都是相同的,而我需要在该特定对话中发送的最后一条消息。
这是我正在使用的 SQL:
SELECT ConversationId,
(SELECT Username FROM dbo.[User] WHERE (UserId = dbo.Conversation.FromUser)) AS FromUser,
(SELECT Username
FROM dbo.[User] User_1
WHERE (UserId = dbo.Conversation.ToUser)) AS ToUser,
(SELECT TOP (1)
MessageBody
FROM dbo.ConversationMessage
WHERE (ConversationId = ConversationId)
ORDER BY MessageDateTime DESC) AS LastMessageBody,
(SELECT TOP (1)
CONVERT(varchar(5), MessageDateTime, 114) AS Expr1
FROM dbo.ConversationMessage ConversationMessage_1
WHERE (ConversationId = ConversationId)
ORDER BY MessageDateTime DESC) AS LastMessageTime
FROM dbo.Conversation;
LastMessageBody 和 LastMessageTime 都应该是唯一的,而且由于 ConversationId 都是唯一的,我不明白为什么每次都应该返回相同的消息。我的理解是单个行的 ConversationId 将在 where 子句中使用,就像其他列中的 UserId 一样?
【问题讨论】:
-
您的查询比您的描述复杂得多。我很难弄清楚真正的问题是什么。
-
这是获取数据的糟糕方式。尝试使用连接而不是子查询
-
解释为什么你得到重复值,条件
WHERE (ConversationId = ConversationId)总是true,你没有将子查询中的值与外部Conversation表关联 -
一开始我确实尝试过加入,但因为我不止一次加入表,我无法让它工作
-
@WebDevelopWolf 以格式正确的文本提供一些示例数据和您的预期结果。它将帮助人们更好地了解您的需求。
标签: sql sql-server where-clause