简体   繁体   中英

Postgres SQL query to get the first row of distinct id

channels table

id |  name 
------------
1  | ABC
2  | XYZ
3  | MNO
4  | ASD

user_channels table

user_id |  channel_id 
----------------------
 555    | 1
 666    | 1
 777    | 1
 555    | 2
 888    | 2
 999    | 3
 555    | 3 

user_chats table

 id | created_at | channel_id | content
---------------------------------------
 2  | time 1     | 1          | Hello
 3  | time 2     | 1          | Hi
 4  | time 3     | 2          | Good day
 5  | time 4     | 2          | Morning

I have these 3 tables in postgres SQL,

I want to write a sql query to get user_channels by user_id and it's latest message only (time 1 is oldest message) from user_chats table. How can I do that?

For example, for user_id = 555, the query should return

 channel_id | content  | created_at
---------------------------------------
 1          | Hi       | time 2
 2          | Morning  | time 4  
 3          | Null     | Null
 

You can use distinct on :

select distinct on (c.channel_id) c.channel_id, uc.content, uc.created_at
from user_channels c left join
     user_chats uc
     on uc.channel_id = c.channel_id
where c.user_id = ?
order by c.idchannel_id, uc.created_at desc;

Use distinct on :

select distinct on (a.channel_id) a.*
from user_chats a
inner join user_channels l on l.channel_id = a.channel_id
where l.user_id = 555
order by a.channel_id, a.createt_at desc

If you want this for all users at once:

select distinct on (l.user_id, a.channel_id) l.user_id, a.*
from user_chats a
inner join user_channels l on l.channel_id = a.channel_id
order by l.user_id, a.channel_id, a.createt_at desc

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM