两位用户常见的帖子

时间:2016-06-12 03:00:30

标签: sql ruby-on-rails postgresql relational-division

鉴于以下简化模型:

  1. User(id, nickname, created_at)
  2. Post(id, user_id, image, text, created_at) ## A post belongs to a user
  3. ViewedPost(id, user_id, post_id, like_type, created_at) ##like_type can either be -1, 0 or 1
  4. 我想根据用户1获得2个不同用户(user1和user2)通常喜欢的帖子(like_type == 1),按created_at排序。

    以下是一个例子:

    给定user1,user2,post1,post2,post3,post4以及以下场景:

    1. user1喜欢(like_type:1)post2,post3,然后是post1
    2. user2喜欢(like_type:1)post4,post1,post2,然后是post3
    3. 常用的帖子是post1,post2,post3。由于我希望根据用户的喜欢顺序排名,因此必须是post2,post3然后是post1。

1 个答案:

答案 0 :(得分:1)

ViewedPost上的自我加入完成了这项工作。其余的是优化和格式化语法:

SELECT post_id
FROM   ViewedPost v1
JOIN   ViewedPost v2 USING (post_id, like_type)
WHERE  v1.user_id = 1
AND    v2.user_id = 2
AND    like_type = 1
ORDER  BY v1.created_at;

假设UNIQUE ViewedPost上的(user_id, post_id)约束,以便同一个用户每个帖子只能有一个条目。