Мессенджер: чаты пользователя

SQLMiddle25 минпроверка — Спринтзапрос · PostgreSQL14-t001

Мессенджер: пользователи, чаты, сообщения. У пользователя — имя и дата регистрации, у чата — название и дата создания, у сообщения — текст, автор и дата. Пользователь состоит в нескольких чатах (M:N), сообщение принадлежит ровно одному чату.

Схема ниже — эталонная (на собесе её проектируешь сам: users, chats, связующая chat_members, messages).

Выведи все чаты пользователя с id = 1 в формате (chat_id, chat_name).

schema.sqlsql
1CREATE TABLE users (2    id            bigint PRIMARY KEY,3    name          text        NOT NULL,4    registered_at timestamptz NOT NULL DEFAULT now()5);6CREATE TABLE chats (7    id         bigint PRIMARY KEY,8    name       text        NOT NULL,9    created_at timestamptz NOT NULL DEFAULT now()10);11CREATE TABLE chat_members (12    chat_id   bigint NOT NULL REFERENCES chats (id) ON DELETE CASCADE,13    user_id   bigint NOT NULL REFERENCES users (id) ON DELETE CASCADE,14    joined_at timestamptz NOT NULL DEFAULT now(),15    PRIMARY KEY (chat_id, user_id)16);17CREATE INDEX chat_members_user_id_idx ON chat_members (user_id);18CREATE TABLE messages (19    id         bigint PRIMARY KEY,20    chat_id    bigint NOT NULL REFERENCES chats (id) ON DELETE CASCADE,21    author_id  bigint NOT NULL REFERENCES users (id),22    body       text   NOT NULL,23    created_at timestamptz NOT NULL DEFAULT now()24);25INSERT INTO users (id, name) VALUES (1, 'Анна'), (2, 'Борис'), (3, 'Вера');26INSERT INTO chats (id, name) VALUES (1, 'general'), (2, 'work'), (3, 'family'), (4, 'empty');27INSERT INTO chat_members (chat_id, user_id) VALUES (1, 1), (3, 1), (1, 2), (2, 2), (2, 3);28-- Анна писала в general дважды, в family — ни разу; в work писала раньше, но из чата вышла29INSERT INTO messages (id, chat_id, author_id, body) VALUES30    (1, 1, 1, 'привет'), (2, 1, 1, 'как дела?'), (3, 1, 2, 'норм'),31    (4, 2, 1, 'старое сообщение'), (5, 2, 3, 'ок');
⌘ Enter — проверить