SQL Tinder для расстановки приоритетов для пользователей, которые вам уже нравятся - PullRequest
0 голосов
/ 09 января 2019
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, это гарантировало бы возвращение Джейн (поскольку Джейн уже любит Джона, и Джон мог бы соответствовать сразу же) ) + Еще 19 человек, чтобы заполнить оставшуюся часть колоды Джона, чтобы Джон продолжал играть больше.

Что такое SQL для "получить людей, которые сначала любят Джона, а затем заполнить остальных случайными пользователями"? Будет ли это ГДЕ (случай, если еще) или какое-то другое утверждение?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Вы можете попробовать что-то подобное, но я думаю, что вы упрощаете. Вы хотите исключить не понравившихся людей из других?

  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
0 голосов
/ 09 января 2019

Вот запрос, который должен удовлетворить ваши потребности.

Работает с помощью условной сортировки с CASE. Пользователям, которым понравился Джон, будет присвоен более высокий приоритет, и они будут отсортированы по id. Другие пользователи получают более низкий случайный приоритет; это также означает, что для данного пользователя эта часть списка не всегда будет одинаковой (что, я считаю, соответствует вашей цели). Количество выходных записей затем контролируется предложением LIMIT.

Я проверил запрос в этой скрипте БД . Вам нужно заменить знак вопроса (?) в предложении CASE на идентификатор пользователя, для которого вы генерируете карту (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...