我正在为我的网站创建聊天应用程序。我已经创建了基本流程,并且我正在接收和发送消息。但现在我必须展示用户的所有聊天记录。我的聊天表的架构是ID,Message,Sender,Receiver,IsRead。 !Here is the picture of schema. 1我要获取所有Distinct用户,特定用户已向其发送消息。我到目前为止所写的查询是
SELECT DISTINCT FromUser
FROM ChatMessages
WHERE FromUser IN (SELECT DISTINCT FromUser FROM ChatMessages WHERE ToUser = @uid)
但是这会返回此用户聊天表中的所有消息。如果我需要写一个不同的查询,请帮助我。或者,我可以针对执行的每个子查询检索单行吗?请注意,我想获取用户发送给具有所有列的另一个用户的最后一条消息。 感谢
答案 0 :(得分:0)
使用row_number()为每个用户分配一个序列号,然后从每个用户那里获取一个
SELECT *, RN = ROW_NUMBER() OVER (PARTITION BY FromUser ORDER BY DateTime DESC)
FROM (
SELECT * FROM ChatMessages
) D
WHERE D.RN = 1
答案 1 :(得分:0)
试试这个
SELECT top 1 FromUser
FROM ChatMessages
WHERE
ToUser = @uid and Datetime = (select max(DateTime) from ChatMessages where ToUser = @uid )
答案 2 :(得分:0)
怎么样:
CREATE TABLE ChatMessages
(id bigint not null
,Message nvarchar(max)
,FromUser bigint not null
,ToUser bigint not null
,DateTime datetimeoffset(7) not null
,IsRead bit not null
)
INSERT ChatMessages
VALUES (1,'MESSAGE', 100, 200, GETDATE()-1, 1)
,(2,'MESSAGE', 100, 200, GETDATE()-2, 1)
,(3,'MESSAGE', 100, 300, GETDATE()-2, 1)
,(4,'MESSAGE', 400, 500, GETDATE()-3, 1)
,(5,'MESSAGE', 400, 500, GETDATE(), 1)
,(6,'MESSAGE', 100, 200, GETDATE(), 1);
CREATE CLUSTERED INDEX idx on chatMessages(FromUser, ToUser, Datetime DESC)
GO
CREATE FUNCTION fetchLastChat (@from bigint, @to bigint)
RETURNS bigint
AS
BEGIN
RETURN(SELECT TOP 1 id
FROM ChatMessages
WHERE FromUser = @from
AND ToUser=@to
ORDER BY DateTime DESC)
END
GO
我的执行计划显示100%聚集索引搜索...
例如:SELECT dbo.fetchLastChat(100,200)