@AFI19

Можно ли оптимизировать запрос?

Мне нужно получить данные чатов для пользователя и к этим данными добавить колонку с именем другого пользователя этого чата.

У меня получился такой запрос. Он работает, но, меня смущает дубликаты запросов и его многоуровневость.

select c.*, name
from chats c
         left join (
            select concat(u.first_name, ' ', u.last_name) as name, cp.chat_id
            from users u
            left join chat_participants ip on u.id = ip.user_id
            where ip.user_id != 1 and ip.chat_id in (
                select cp.chat_id
                from chat_participants cp
                where cp.user_id = 1 and cp.is_deleted = false -- duplicate
            )
        ) p on p.chat_id = c.id
where c.id in(
    select cp.chat_id
    from chat_participants cp
    where cp.user_id = 1 and cp.is_deleted = false -- duplicate
);


Можно ли его оптимизировать? И как это сделать?

Таблицы
chats
62b8c400cc7d6576219086.jpeg
chat_participants
62b8c4177f041688951535.jpeg
users
62b8c4404f345276800093.jpeg

Explain
62b8c7ee365c2677395630.jpeg
  • Вопрос задан
  • 167 просмотров
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Можно использовать inline views (или еще называют common table expressions)

with cp_view as (
 select cp.chat_id
 from chat_participants cp
 where cp.user_id = 1 and cp.is_deleted = false)
.....
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы