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