0

如果有任何未读消息,我需要在用户登录时显示通知。因此,如果多个用户在用户离线时发送(每个用户 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 出现两次。我只需要该用户的一条记录。

这怎么可能

4

2 回答 2

0

我不完全确定我完全理解您的问题 - 但一种方法是使用 CTE(通用表表达式)。

使用此 CTE,您可以按某些标准(即您的)对数据进行分区,MessageFrom并让 SQL Server 为每个分区从 1 开始为您的所有行编号,并按其他标准排序 - 这是您的问题完全不清楚的一点,您是否甚至关心每个MessageFrom数字的行是按什么排序的(您是否有某种 aMessageDate或可以订购的东西?)...

所以尝试这样的事情:

;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列排序,以便选择最新的(最新的)消息。

这是否接近你正在寻找的东西?

于 2012-06-16T15:31:10.907 回答
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 中似乎并不那么容易。

于 2012-06-16T15:37:00.830 回答