Sql 如何请求在房间中显示最新消息

Sql 如何请求在房间中显示最新消息,sql,sql-server,inner-join,chat,Sql,Sql Server,Inner Join,Chat,我在聊天。我有4张桌子: 房间 信息 客人 使用者 在messages表中存储消息,在Users-Users表中,Guest-将访客存储在房间中。房间就像一个对话或对话。 我想请求获取特定用户为客人的每个房间的最新消息 SELECT DISTINCT TOP (15) r.id_room, r.type_room, r.name_room, m.content_message, m.image_message, m.file_message, m.date_message

我在聊天。我有4张桌子:

房间

信息

客人

使用者

在messages表中存储消息,在Users-Users表中,Guest-将访客存储在房间中。房间就像一个对话或对话。 我想请求获取特定用户为客人的每个房间的最新消息

SELECT DISTINCT TOP (15) r.id_room, r.type_room, r.name_room,
    m.content_message, m.image_message,
    m.file_message, m.date_message, u.person
    FROM Rooms AS r
      INNER JOIN Guest AS g ON g.id_room = r.id_room
      INNER JOIN Users AS u ON u.id_user = g.id_user
      INNER JOIN Messages AS m ON m.id_room = r.id_room
        WHERE g.id_user = 'OCI59TNG8ZZ'
        ORDER BY m.date_message DESC
他显示了房间里的所有信息

我认为如果没有重复的id_房间,这个请求会很好。 但是我不知道怎么做你可以试试这个:

SELECT  id_room,
        type_room,
        name_room,
        content_message,
        image_message,
        file_message,
        date_message,
        person
FROM    (
            SELECT  r.id_room,
                    r.type_room,
                    r.name_room,
                    m.content_message,
                    m.image_message,
                    m.file_message,
                    m.date_message,
                    u.person,
                    ROW_NUMBER() OVER(PARTITION BY R.ID_ROOM ORDER BY m.date_message DESC)  AS  RN
            FROM    Rooms AS r
            INNER JOIN Guest AS g ON g.id_room = r.id_room
            INNER JOIN Users AS u ON u.id_user = g.id_user
            INNER JOIN Messages AS m ON m.id_room = r.id_room
            WHERE   g.id_user = 'OCI59TNG8ZZ'
        ) V1
WHERE   V1.RN = 1

使用通用表表达式,如下所示:

WITH CTE AS (
            SELECT  r.id_room,
                    r.type_room,
                    r.name_room,
                    m.content_message,
                    m.image_message,
                    m.file_message,
                    m.date_message,
                    u.person,
                    ROW_NUMBER() OVER(PARTITION BY R.ID_ROOM ORDER BY m.date_message DESC)  rn
            FROM  Rooms AS r
            INNER JOIN Guest AS g ON g.id_room = r.id_room
            INNER JOIN Users AS u ON u.id_user = g.id_user
            INNER JOIN Messages AS m ON m.id_room = r.id_room
            WHERE   g.id_user Like 'OCI59TNG8ZZ'
        )

SELECT * FROM CTE WHERE rn = 1

最好显示表格的DDL而不是图片。这是否回答了您的问题?您是否忘记了“结束”条款中的“DESC”?出于某种原因,m.date_的订单消息在该答案中不起作用…@Сцццц刚刚在“结束”条款中添加了DESC。它应该是有效的