2016-06-12 2 views
0

Es gelten folgende vereinfachte Modelle:Gemeinhin mochte Beiträge von zwei Benutzern

  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

Ich möchte die Beiträge erhalten, die häufig gemocht wurden (like_type == 1) von 2 verschiedenen Benutzern (user1 und user2), sortiert nach created_at, nach user1. Hier

ein Beispiel:

Bei Benutzer1, Benutzer2 post1, post2, Post3, Post4 und das folgende Szenario:

  1. benutzer1 gefällt das (like_type: 1) post2, Post3, dann post1
  2. benutzer2 gefällt das (like_type: 1) Post4, post1, post2, dann Post3

Die allgemein gemocht Beiträge post1, post2, Post3 sind. Da ich möchte, dass dies nach user1 Reihenfolge der Likes eingestuft wird, muss es post2, post3 dann post1 sein.

Antwort

1

Ein Self-Join auf ViewedPost macht den Job. Der Rest ist die Optimierung und Formatierung Syntax:

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 einen Constraint in ViewedPost auf (user_id, post_id) Unter der Annahme, so dass der gleiche Benutzer nur ein Eintrag pro Pfosten haben kann.

+0

Es funktionierte perfekt. Kann ich es irgendwie mit 'Active Record' machen? –

Verwandte Themen