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,您可能会认识到它似乎在获取包含以下内容的初始卡组:
如果我们将示例扩展到100个以上的用户,id = 1约翰正在查看该应用程序,并且我们获取的限制为20,这将确保Jane回来(因为Jane已经喜欢John并且John可以立即进行匹配) )和另外19个人填补了约翰的下半部分,以使约翰继续刷卡。
“首先吸引喜欢John的人,然后让其余用户充满随机用户”的SQL是什么?这是WHERE(如果有其他情况)还是其他语句?
答案 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