Как оптимизировать запросы?

Рейтинг: 0Ответов: 1Опубликовано: 02.03.2023

Как оптимизировать запросы? Привет, есть чат, который состоит из следующих таблиц

  1. Комнаты чата rooms

    id, type(USER_TO_USER, USER_TO_SHOP, USER_TO_PLATFORM), name

  2. Участники комнаты чата room_participants

    id, participantType (USER, SHOP, PLATFORM), participant_id

  3. Список сообщений

    room_messages - id, participant_id, text, is_read

Дополнительно:

  1. Таблица пользователей users

    id, first_name, last_name, image, image_src

  2. Таблица магазинов shops

    id, name, logo, logo_src

Стоит задача:

  1. Вывести список комнаты с ее участниками для конкретного пользователя + последнее сообщение комнаты (как ВК)

первое что я сделал это запрос на получение всех комнат: в которых состоит конкретный пользователь

select r.id, r.name from rooms as r
left join room_participants rp on r.id = rp.room_id
where rp."participantType" = 'USER' and rp.participant_id = 1

второй запрос я делаю на получение участников (кроме текущего пользователя) для каждой комнаты,

select
    room_id,
    case
        when "participantType" = 'USER' and participant_id != 1 then (SELECT id FROM users WHERE id = participant_id)
        when "participantType" = 'SHOP' then (SELECT id FROM shops WHERE id = participant_id)
    END AS participant_id,

    case
        when "participantType" = 'USER' and participant_id != 1 then (SELECT first_name FROM users WHERE id = participant_id)
        when "participantType" = 'SHOP' then (SELECT name FROM shops WHERE id = participant_id)
    END AS participant_name,

    case
        when "participantType" = 'USER' and participant_id != 1 then (SELECT image FROM users WHERE id = participant_id)
        when "participantType" = 'SHOP' then (SELECT logo FROM shops WHERE id = participant_id)
    END AS participant_image,

    case
        when "participantType" = 'USER' and participant_id != 1 then (SELECT image_src FROM users WHERE id = participant_id)
        when "participantType" = 'SHOP' then (SELECT logo_src FROM shops WHERE id = participant_id)
    END AS participant_image_src

from room_participants

where room_id in (1)

Вопрос вот в чем, как можно эти запросы оптимизировать?

и второй вопрос, если это оптимальные запросы, то как при последнем запросе, как убрать пустые строки

введите сюда описание изображения

Ответы

▲ 1Принят

Не знаю насчёт оптимальности, но так читается легче, и не будет пустых строк:

select
    room_id,
    participant_id,
    coalesce(users.first_name, shops.name) AS participant_name,
    coalesce(users.image, shops.logo) AS participant_image,
    caolesce(users.image_src, shops.logo_src) AS participant_image_src
from room_participants
left join users on users.id = room_participants.participant_id and room_participants."participantType" = 'USER'
left join shops on shops.id = room_participants.participant_id and room_participants."participantType" = 'SHOP'
where room_id in (1)
  and (users.id != 1 or shops.id is not null)