如果有任何未读消息,我需要在用户登录时显示通知。因此,如果多个用户在用户处于离线状态时发送(每个5条消息),则应在登录时显示这些消息。手段必须显示每个用户的最后消息。
我使用加入查找记录。
在此方案中,来自用户的消息不是主键。
这是我的查询
SELECT
UserMessageConversations.MessageFrom, UserMessageConversations.MessageFromUserName,
UserMessages.MessageTo, UserMessageConversations.IsGroupChat,
UserMessageConversations.IsLocationChat,
UserMessageConversations.Message, UserMessages.UserGroupID,UserMessages.LocationID
FROM
UserMessageConversations
LEFT OUTER JOIN
UserMessages ON UserMessageConversations.UserMessageID = UserMessages.UserMessageID
WHERE
UserMessageConversations.MessageTo = 743
AND UserMessageConversations.ReadFlag = 0
这是从上述查询中获得的输出。
MessageFrom -582出现两次。我只需要该用户的一条记录。
怎么可能
答案 0 :(得分:0)
我不完全确定我完全理解你的问题 - 但一种方法是使用CTE(公用表格表达式)。
使用此CTE,您可以按照某些条件对数据进行分区 - 即MessageFrom
- 并为每个分区的所有行开始SQL Server编号,按其他条件排序 - 这是从您的问题中完全不清楚,您是否关心每个MessageFrom
数字的行是否排序(您是否有某种MessageDate
或您可以订购的东西?)..
所以尝试这样的事情:
;WITH PartitionedMessages AS
(
SELECT
umc.MessageFrom, umc.MessageFromUserName,
um.MessageTo, umc.IsGroupChat,
umc.IsLocationChat,
umc.Message, um.UserGroupID, um.LocationID ,
ROW_NUMBER() OVER(PARTITION BY umc.MessageFrom
ORDER BY MessageDate DESC) AS 'RowNum' <=== totally unclear yet
FROM
dbo.UserMessageConversations umc
LEFT OUTER JOIN
dbo.UserMessages um ON umc.UserMessageID = um.UserMessageID
WHERE
umc.MessageTo = 743
AND umc.ReadFlag = 0
)
SELECT
MessageFrom, MessageFromUserName, MessageTo,
IsGroupChat, IsLocationChat,
Message, UserGroupID, LocationID
FROM
PartitionedMessages
WHERE
RowNum = 1
在这里,我只选择每个“分区”的“第一个”条目(即每个MessageFrom
) - 按“想象的”MessageDate
列排序,以便最新(最新) )将选择消息。
这会接近你想要的吗?
答案 1 :(得分:0)
如果您将它们视为相同的行,我假设您不关心消息字段。
在这种情况下,您可以使用DISTINCT
子句:
SELECT DISTINCT
UserMessageConversations.MessageFrom, UserMessageConversations.MessageFromUserName,
UserMessages.MessageTo, UserMessageConversations.IsGroupChat,
UserMessageConversations.IsLocationChat,
UserMessages.UserGroupID,UserMessages.LocationID
FROM
UserMessageConversations
LEFT OUTER JOIN
UserMessages ON UserMessageConversations.UserMessageID = UserMessages.UserMessageID
WHERE
UserMessageConversations.MessageTo = 743
AND UserMessageConversations.ReadFlag = 0
通常使用distinct子句,每个不同的行属性组都有一行。 如果您的要求是为所有消息显示单个字段(例如:每条消息折叠在一条消息中,并且它们之间有分隔符),您可以使用聚合函数,但在SQL Server中似乎是not that easy. < / p>