嵌套查询,子查询 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;
我有两个表:
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;