2016-06-12 2 views
0

Учитывая следующие упрощенные модели:Обычно понравившиеся сообщения от двух пользователей

  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

Я хотел бы получить сообщения, которые были обычно понравившиеся (like_type == 1) двумя пользователями (user1 и user2), отсортированными по created_at, согласно user1.

Вот пример:

Учитывая user1, user2, post1, post2, post3, post4 и следующий сценарий:

  1. user1 нравится (like_type: 1) post2, post3, затем post1
  2. 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), так что тот же пользователь может иметь только один вход на пост.

+0

Он работал отлично. Есть ли способ сделать это с помощью «Активной записи»? –

Смежные вопросы