-1

I am doing chat.I have 4 tables:

Rooms

columns

Messages

columns

Guest

columns

Users

columns

In the messages table messages are stored, in the table Users - users, Guest - stores visitors in the room. A room is like a dialogue or conversation. I want to make a request to get the latest message for each room where a particular user is a 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

And he displays all the messages that were inside the room

output

I think this request would be good if id_room were not duplicated. But I don’t understand how to do it

LukStorms
  • 28,916
  • 5
  • 31
  • 45

2 Answers2

0

You can try this:

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
Max Zolotenko
  • 1,082
  • 7
  • 13
0

Use a Common Table Expression like below :

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
Amira Bedhiafi
  • 8,088
  • 6
  • 24
  • 60