SQL如何选择有人发布的最新评论

时间:2017-01-31 20:19:13

标签: sql postgresql greatest-n-per-group

我正在使用Postgres数据库(9.6)并在我的查询中使用SQL。我有一个名为 Comment_Replies 的表和3个字段,我专注于Post_ID(Post / thread评论的整数),Profile_ID(用户评论的整数唯一标识符)和(Last_Reply是日期的TimeStamp)的回复)。如果用户对帖子(Post_ID)发表评论,我想检索有人在Post_Id中发布的最新评论,例如

  1. Post_ID :150 Profile_ID :10 Last_Reply :1月10,2017
  2. Post_ID :150 Profile_ID :10 Last_Reply :1月12,2017
  3. Post_ID :150 Profile_ID 11 Last_Reply :1月19,2017
  4. 假设我是用户10或profile_ID 10,那么如何查看Post_ID 150的最新评论?例如,用户10对ID为150的帖子有2个回复,但是在2017年1月19日,个人ID为11的用户创建了更新的评论。对于我现在的SQL查询,我有这个

    select Distinct ON(stream_id)stream_id,last_reply,comments from
    comment_replies where profile_id=10 order by stream_id desc .
    

    此当前查询将为我创建2017年1月12日创建的记录#2。我基本上有2个要求首先获取当前用户发布的帖子(这是通过上面的查询完成),第二个获得与该Post_ID对应的最后一个评论。有点像Facebook,它可以让你知道线程的最新评论。任何建议都会很棒

2 个答案:

答案 0 :(得分:1)

你需要过滤"溪流"用户评论过。一种方法使用$1

IN

答案 1 :(得分:1)

我创建了一个test

create table test
(
 post_id int, 
 profile_id int, 
 last_reply datetime
);

然后我插入了以下数据

insert into test values(150, 10, '01-01-2017');
insert into test values(150, 10, '02-01-2017');
insert into test values(150, 10, '03-01-2017');

然后以下查询返回所需的结果

select t.post_id, t.profile_id, t.last_reply
from test t
inner join(
   select profile_id, max(last_reply) as 'last_comment'
   from test
   group by profile_id
)tm on t.profile_id = tm.profile_id and t.last_reply = tm.last_comment 

附图显示整个过程,包括结果

enter image description here