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が2回表示されます。このユーザーのレコードは1つだけ必要です。

どうすれば可能ですか

4

2 に答える 2

0

あなたの質問を完全に理解しているかどうかは完全にはわかりませんが、1 つのアプローチは CTE (Common Table Expression) を使用することです。

この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 に答える