2017-01-10 127 views
0

我有两个表:嵌套查询,子查询SQL

select * from friends; 
user_id | friend_id |   created_at   
---------+-----------+---------------------------- 
user | user2  | 2017-01-09 21:29:56.31972 
user | user3  | 2017-01-09 21:29:58.567925 
user | user4  | 2017-01-09 21:30:01.200806 
user2 | user  | 2017-01-09 21:30:49.498912 
user3 | user  | 2017-01-09 21:30:53.549042 
user4 | user  | 2017-01-09 21:30:56.519135 
id | user_id | user_from | message 
----+---------+-----------+--------- 
    1 | user | user2  | hey 
    2 | user | user3  | de 
    3 | user | user4  | bal 
    4 | user | user3  | ok 
    5 | user | user3  | nice 
    6 | user | user4  | cana 
    7 | user | user2  | doc 

此SQL语句成功地检索的最后一条消息给一个用户。例如。通过用户3发送到用户

select id, user_from, message 
from messages 
WHERE user_id = 'user' 
AND user_from = 'user3' 
ORDER BY id DESC 
limit 1; 
id | user_from | message 
----+---------+--------- 
    5 | user3 | nice 

的最后一条消息我需要检索信息的集合。每个消息表示由朋友发送到用户的最后一条消息

我需要的是通过标准化数据库,关系数据库的查询,使我得到这样的

id | user_from | message 
----+-----------+--------- 
    7 | user2  | doc 
    5 | user3  | nice 
    6 | user4  | cana 

回答

0

distinct on是这里最简单的解决方案。

这将使用postresql扩展SQL标准,有也做到这一点使用窗口功能的标准方法,但它更复杂,使用自加入潜在低效的方式。

+0

这不起作用:ERROR:SELECT DISTINCT ON表达式必须初始ORDER BY表达式 LINE 1匹配:SELECT DISTINCT ON(user_from)ID,user_from,消息 – user1000622

+0

我修改与下面的查询选择... DISTINCT ON(user_from)id,user_from,来自消息的消息 WHERE user_id ='user'AND user_from ='user3' ORDER BY user_from,id DESC; id | user_from |消息 ---- + ----------- + --------- 5 | user3 |不错 – user1000622

+0

但仍然没有达到我想要的。仅检索一行 – user1000622

0

您可以使用连接和窗口功能(对于您的情况是row_number)。

假设第一个表格是friends,第二个表格是messages,则此解决方案可能有效(尚未测试)。

select id, user_from, message 
from (
    select m.* 
    , row_number() over(partition by m.user_from order by f.created_at desc) as N 
    from friends f, messages m 
    where f.user_id = m.user_id and f.friend_id = m.user_from) x 
where N = 1;