Общедоступные посты двух пользователей
Приведены следующие упрощенные модели:
User(id, nickname, created_at)
Post(id, user_id, image, text, created_at) ## A post belongs to a user
ViewedPost(id, user_id, post_id, like_type, created_at) ##like_type can either be -1, 0 or 1
Я хотел бы получить сообщения, которые обычно нравились (like_type == 1
) 2 разными пользователями (user1 и user2), отсортировано по created_at
По словам пользователя1.
Вот пример:
Даны user1, user2, post1, post2, post3, post4 и следующий сценарий:
- пользователю нравится 1 (like_type: 1) post2, post3, затем post1
- Пользователь user2 любит (like_type: 1) post4, post1, post2, затем post3
Самые популярные посты: post1, post2, post3. Поскольку я хочу, чтобы это оценивалось в соответствии с порядком лайков user1, это должно быть post2, post3, а затем post1.
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)
, так что один и тот же пользователь может иметь только одну запись на пост.