SQL Tinder为已经喜欢您的用户确定优先顺序

时间:2019-01-09 01:02:31

标签: sql postgresql

profile
---
id  name
1   John
2   Jane
3   Jill
...

swipe
---
id  profile_1_id  profile_2_id  liked
1   2             1             true
2   3             1             false
...

如果您以前使用过Tinder,您可能会认识到它似乎在获取包含以下内容的初始卡组:

  1. 已经喜欢您并且可以立即与之匹配的用户,被推到顶部
  2. 其他用户
  3. (超出此问题的范围,但它还会吸引一些更具吸引力的用户)

如果我们将示例扩展到100个以上的用户,id = 1约翰正在查看该应用程序,并且我们获取的限制为20,这将确保Jane回来(因为Jane已经喜欢John并且John可以立即进行匹配) )和另外19个人填补了约翰的下半部分,以使约翰继续刷卡。

“首先吸引喜欢John的人,然后让其余用户充满随机用户”的SQL是什么?这是WHERE(如果有其他情况)还是其他语句?

2 个答案:

答案 0 :(得分:1)

这是应该满足您需求的查询。

通过对CASE使用条件排序来工作。喜欢John的用户将获得更高的优先级,并按照id进行排序。其他用户则享有较低的随机优先级;这也意味着,对于给定的用户,列表的这一部分将不会总是相同的(我认为这符合您的目的)。然后,通过LIMIT子句控制输出记录的数量。

我在this db fiddle中测试了该查询。您需要将?子句中的问号(CASE替换为为其生成卡的用户ID(示例数据中的1代表约翰)。

SELECT
    p.id, 
    p.name
FROM 
    profile p
    LEFT JOIN swipe s on s.profile_1_id = p.id
ORDER BY 
    CASE s.profile_2_id
        WHEN ? THEN 0
        ELSE FLOOR(random() * 10) + 1
    END,
    p.id
LIMIT 20

答案 1 :(得分:0)

您可以尝试类似的方法,但我认为您过于简单了。您要从其他人中排除不喜欢的人吗?

  select * from profile p
    left outer join swipe s on (p.id=profile_1_id and s.profile_2_id  = 1 and liked = true)
    where 
     p.id<>1
    order by coalesce(profile_2_id , random()*-1000000) desc
    limit 20