嵌套查询,子查询 SQL

Nested queries , subquery 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 语句成功检索到发送给一位用户的最后一条消息。例如。 user3 发送给 user

的最后一条消息
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

首先规范化您的数据库,关系数据库需要这样做。

我不确定您对数据库设计和 sql 的熟悉程度。但是考虑使用连接,它与规范化的数据库一起工作得更好;)

在这里阅读规范化 http://www.studytonight.com/dbms/database-normalization.php

还可以在 w3schools 或 tutorialspoint 上查找加入,你会得到你需要的

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

select DISTINCT ON(user_from) id, user_from, message 
from messages WHERE user_id = 'user'
ORDER BY user_from,id DESC;

这使用了 SQL 标准的 postresql 扩展,还有一种使用 window 函数执行此操作的标准方法,但它更复杂,并且使用自连接可能效率低下.

您可以使用 join 和 window 函数(您的情况是 row_number)。

假设第一个 table 是 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;