2010-10-20 3 views
0

J'ai un modèle d'utilisateur qui a des amis (User.friends avec une table de jointure user_id/friend_id appelée suivante). Chaque utilisateur a des événements (la table des événements a une colonne user_id).Demande SQL pour trouver les n derniers enregistrements de chacun des amis d'un utilisateur

Pour un flux d'activité, je veux obtenir un tableau avec les 20 derniers événements des amis de l'utilisateur. En ce moment, j'appelle les 20 derniers événements pour chaque ami, en triant tout par date et en gardant simplement les 20 derniers événements.

Comment puis-je faire cela directement dans la base de données de sorte que je n'ai besoin que d'une requête au lieu d'une par ami?

Y a-t-il un moyen de le faire directement avec Rails? Ou devrais-je utiliser une requête SQL?

Merci,

Kevin

Répondre

1

Je le ferais dans une requête SQL comme ceci:

select Events.Summary from Events 
join Followings 
    on Events.User_Id = Followings.Friend_Id 
where Followings.User_Id = @User_Id 
order by Events.Date desc 
limit 20; 

limit 20 est MySql - est-il le même dans PostgreSql?

+1

Oui, "limite 20" fonctionnera également dans PostgreSQL. –

+0

Super! Et disons que je ne veux pas un type particulier d'événements qui est spécifié dans ses attributs, quelque chose comme ça fonctionnerait? "select Events.Summary des événements où Events.kind! = Not_that_kind rejoindre Followings ..." –

+1

Vous devez mettre cela dans la clause WHERE. par exemple. 'où Followings.User_Id = @User_Id et Events.kind <> not_that_kind'. –

1
select e.* from 
(select rownum r , e.* from events e where user_id in (our target friends) order by date desc)  
where r < 20 ; 

Je ne sais pas si rownum est appelé 'rownum' dans Postgres. rownum - est le nombre de rangs. Si e. * ne fonctionne pas, essayez d'écrire chaque champ manuellement. out target friends est similaire à select user_id2 from friend_connections where user_id1 = targetId union select user_id1 from friend_connections where user_id2 = targetId. Oui, je comprends que c'est très moche.

Questions connexes