【问题标题】:How to make a request to display the latest messages in the room如何请求在房间中显示最新消息
【发布时间】:2020-04-17 12:24:20
【问题描述】:

我正在聊天。我有 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_room 不重复,我认为这个请求会很好。 但我不明白该怎么做

【问题讨论】:

标签: sql sql-server inner-join chat


【解决方案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

【讨论】:

  • 您是否忘记了“OVER”子句中的“DESC”?
  • ORDER BY m.date_message 由于某种原因在此答案中不起作用...
  • @твойкот 刚刚在 OVER 子句中添加了 DESC。它应该工作
【解决方案2】:

你可以试试这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    相关资源
    最近更新 更多