У меня есть таблица apps
. Каждое приложение имеет множество conversations
и users
. В разговоре много messages
, и каждое сообщение может принадлежать visitor
или user
, а visitor
может иметь много разговоров.Duplicates results in query
Для каждого из моих разговоров я хочу прикрепить имя и аватар пользователя, который недавно написал в разговоре.
Если ни один пользователь не ответил, вместо этого я хотел бы захватить 3 последних созданных пользователя avatars
вместе с именем приложения и использовать их вместо этого.
Это то, что у меня до сих пор, но он возвращает несколько результатов за тот же разговор идентификатор, и я не нашел решение, чтобы получить пользователь приложения аватары
select
c.id,
c.last_message,
c.last_activity,
coalesce(last.display_name, a.name || ' Team') as name,
array_agg(last.avatar)
from messages m
left join conversations c on c.id = m.conversation_id
left join apps a on a.id = c.app_id
left join lateral (
select u.id, u.display_name, u.avatar
from users u
where u.id = m.user_id
) as last on true
where c.visitor_id = 'c6p77hu9v000a4zcth4lnefn9'
group by c.id, last.display_name, last.avatar, a.name
order by c.inserted_at desc
Любой помощи в значительной степени оценивается
Я не уверен, что это решает. Недавно ответил, что вы хотите получить последнюю вставленную строку для этой конкретной беседы. Вы пытались использовать MIN/MAX() для этого разговора? Было бы лучше, если бы вы отображали структуру таблицы и образец. –
Предоставьте образцы данных в пределах желаемого результата, и я смогу помочь :) – kbball