2011-10-19 22 views
2

私は、 "user_messages_index"というテーブルからページされたデータを選択し、 "social_user_messages"というテーブルからの会話に "lastmesage"を含む "GetConversationPaged" spを持っています。 微調整が可能かどうかは分かりませんが、欠けているものがあります。 select MAX(messageId)で取得するlastMessageIdによって「Row_number」をソートする必要があります。SQL Server Row_number()OVER with GROUP BY

PS:複数の受信者に同じメッセージを送信する必要があるため、メッセージインデックスとメッセージテーブルがあります。同じメッセージを何度も繰り返し挿入するのではなく、インデックステーブルを使用する

最新のメッセージIDで結果を並べ替えるにはどうすればよいですか?ここで


は、テーブルとSPS私は

--index table-- --messagesがtable--

CREATE TABLE [dbo].[social_user_messages_index](
[senderId] [int] NOT NULL, 
[recipientId] [int] NOT NULL, 
[messageId] [int] NOT NULL, 
[isRead] [bit] NOT NULL 
) ON [PRIMARY] 

CREATE TABLE [dbo].[social_user_messages](
[id] [int] IDENTITY(1,1) NOT NULL, 
[message] [nvarchar](1000) NOT NULL, 
[sendDate] [datetime] NOT NULL, 
) ON [PRIMARY] 

--spを使用しています -

ALTER PROCEDURE [dbo].[GetConversationPaged] 
@userId int, 
@isRead bit, 
@PageNumber int, 
@PageSize int 
AS 
BEGIN 

    DECLARE @FirstRow INT, @LastRow INT, @RowCount INT, @PageCount INT 
    --- find recordcount and pages 
    SELECT @RowCount = COUNT(1) OVER(), 
      @PageCount = COUNT(*) OVER()/@PageSize 
      FROM social_user_mesages_index s 
      WHERE s.recipientId = @userId and [email protected] 
      GROUP BY senderId 
    --- calculate pages 
    IF @RowCount % @PageSize != 0 SET @PageCount = @PageCount + 1 
    IF @PageNumber < 1 SET @PageNumber = 1 
    IF @PageNumber > @PageCount SET @PageNumber = @PageCount 
    --- select paging data 
    SELECT currentpage = @PageNumber, totalpages = @PageCount, totalrows = @RowCount 
    SET @FirstRow = (@PageNumber - 1) * @PageSize + 1; 
    SET @LastRow = (@PageNumber - 1) * @PageSize + @PageSize; 

    --- select records  
    WITH mytable 
     AS (

      SELECT Row_number() OVER (ORDER BY (SELECT 1)) AS rownumber, 
        (Select name from domains_users d where d.id=s.senderId) as senderName, 
        (select MAX(messageId)) as lastMessageId, 
        (select m.[message] from social_user_messages m where m.id = (select MAX(messageId))) as [message] 
        --,(select m.sendDate from social_user_messages m where m.id = (select MAX(messageId))) as lastMessageDate 
        ,senderId 
      FROM social_user_mesages_index s 
      WHERE s.recipientId = @userId and [email protected] 
      GROUP BY senderId 

     ) 

    SELECT * 
    FROM mytable 
    WHERE rownumber BETWEEN @FirstRow AND @LastRow 
    ORDER BY rownumber ASC; 
END 
+0

だけでなく、 "ROW_NUMBER()OVER(ORDER MAX BY(messageIdです)DESC)ROWNUMBER ASは" 助けているようです。しかし、それは私の脳のために複雑になっています:)誰もそれを確認できますか? – nLL

答えて

3

CTEで、social_user_messages_indexのスペルが間違っていました。私はまたあなたがいくつかの場所を持っていたGroup BY SenderIdを削除し、CTEを更新しました。これはあなたが望んでいた何をしていない場合、私に知らせて、私はそれを微調整することができます

ALTER PROCEDURE [dbo].[GetConversationPaged] 
@userId int, 
@isRead bit, 
@PageNumber int, 
@PageSize int 
AS 
BEGIN 

    DECLARE @FirstRow INT, @LastRow INT, @RowCount INT, @PageCount INT 
    --- find recordcount and pages 
    SELECT @RowCount = COUNT(1) OVER() 
     , @PageCount = COUNT(*) OVER()/@PageSize 
    FROM dbo.social_user_messages_index AS s 
    WHERE s.recipientId = @userId and [email protected] 

    --- calculate pages 
    IF @RowCount % @PageSize != 0 SET @PageCount = @PageCount + 1 
    IF @PageNumber < 1 SET @PageNumber = 1 
    IF @PageNumber > @PageCount SET @PageNumber = @PageCount 

    --- select paging data 
    SELECT currentpage = @PageNumber 
     , totalpages = @PageCount 
     , totalrows = @RowCount; 
    SET @FirstRow = (@PageNumber - 1) * @PageSize + 1; 
    SET @LastRow = (@PageNumber - 1) * @PageSize + @PageSize; 

    --- select records  
    WITH mytable AS 
    (
     SELECT Row_number() OVER (ORDER BY MessageId DESC) AS rownumber 
     , du.name as senderName 
     , m.Message 
     , senderId 
     FROM social_user_messages_index AS s 
     INNER JOIN dbo.domains_users AS du ON s.SenderId = du.id 
     INNER JOIN dbo.social_user_messages AS m ON s.messageId = m.id 
     WHERE s.recipientId = @userId 
     AND [email protected] 
    ) 
    SELECT * 
    FROM mytable 
    WHERE rownumber BETWEEN @FirstRow AND @LastRow 
    ORDER BY rownumber ASC; 
END 
+0

私は 'dbo.domains_users'はあなたがそれについての情報をもっと提供しなかったので' id INT'と 'name NVARCHAR'だけであるとも仮定しました。 –