Можно ли определить один SQL-запрос, который извлекает набор допустимых foreign_keys из одной таблицы, а затем использует их для фильтрации другой? - PullRequest
0 голосов
/ 05 марта 2010

В частности, я пытаюсь выяснить, возможно ли сгенерировать SQL, который выполняет то, что я хочу передать в метод find_by_sql Ruby-on-Rails.

Представьте, что есть пользователи, которые объединяются циклическидругим пользователям за объединительным столомКаждый пользователь имеет возможность создавать комментарии.

Я бы хотел, чтобы SQL-запрос возвращал последние 100 комментариев, созданных любыми друзьями данного пользователя, чтобы я мог отобразить их все в одном удобном для пользователя месте.см.

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

Редактировать: Уточнение настроек.Я не совсем уверен, как написать определение схемы, поэтому я опишу его в терминах Rails.

class User
  has_many :friends, :through => :friendships
  has_many :comments
end
class Friendship
  belongs_to :user
  belongs_to :friend, :class_name => "User", :foreign_key => "friend_id"
end
def Comment
  has_one :User
end

1 Ответ

1 голос
/ 05 марта 2010

Это не так сложно, вы просто используете соединения. Чтобы получить только комментарии, вам нужно только присоединиться к таблице Friendships и таблице Comments, но вам, вероятно, также понадобится некоторая информация из таблицы Users для человека, который написал комментарий.

Это получит последние 100 комментариев от людей, которые дружат с пользователем с id 42:

select top 100 c.CommentId, c.CommentText, c.PostDate, u.Name
from Friendships f
inner join Users u on u.UserId = f.FriendUserId
inner join Comments c on c.UserId = u.UserId
where f.UserId = 42
order by c.PostDate desc
...