仅检索每个子查询的单个结果

时间:2017-10-09 06:14:07

标签: sql sql-server

我正在为我的网站创建聊天应用程序。我已经创建了基本流程,并且我正在接收和发送消息。但现在我必须展示用户的所有聊天记录。我的聊天表的架构是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)

但是这会返回此用户聊天表中的所有消息。如果我需要写一个不同的查询,请帮助我。或者,我可以针对执行的每个子查询检索单行吗?请注意,我想获取用户发送给具有所有列的另一个用户的最后一条消息。 感谢

3 个答案:

答案 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)

http://sqlfiddle.com/#!6/19bd8/1/0