2014-12-10 4 views
2

Допустим, есть таблица «posts», которая содержит сообщения в блоге, и другую таблицу «избранное», которая связывает имя пользователя с сообщением. Многие пользователи могут любить сообщение, поэтому отношения - это одно сообщение для многих избранных.SQLAlchemy left join using subquery

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

Я хочу, чтобы некоторые вещи, как:

current_user = 'testuser' 
posts.query.outerjoin(favorites, and_(posts.post_id == favorites.post_id, favorites.username == current_user)).limit(10).all() 

Это пойми меня очень близко, за исключением того, что кажется, что условие «favorites.username == current_user» в основном получение игнорировались. Это то, что я ищу в реальной SQL:

SELECT * 
FROM posts p 
LEFT JOIN (
      SELECT * FROM favorites f WHERE f.user_id = 'testuser' 
     ) ff ON ff.post_id = p.post_id 
LIMIT 10 

Стоит также отметить, что я определил отношения на постах, как:

favorites = db.relationship("favorites") 

И я определил внешний ключ на избранные, как это :

post_id = db.Column(db.String(255), db.ForeignKey('posts.post_id')) 

Как это сделать в SQLAlchemy?

ответ

2

Действительно, вам просто нужно заменить outerjoin на join, и фильтр будет работать нормально.

Кроме того, если ваш favorites таблица не содержит никакой дополнительной информации, и только ссылки users и posts, вы должны рассмотреть, просто определив `Many to Many' relationship. В примерах документации Parent/Child будет вашим пользователем/сообщением.

Update-1: просто ответить на вторую часть вопроса данного Ваш комментарий, ниже запрос должен дать Вам идею:

current_user = 2 
subq = (db.session.query(favorites) 
     .filter(favorites.user_id == current_user).subquery('ff')) 
q = (db.session.query(posts, subq.c.score) 
    .outerjoin(subq, subq.c.post_id == posts.post_id)) 
q = q.order_by(subq.c.score.desc()) 
for post, score in q: 
    print(post, score) 
+0

В таблице фаворитов также содержат счет - например, 1-5 сколько пользователю нравится сообщение. Кроме того, когда я использую соединение, появляются только сообщения, которые были в порядке. Вместо этого я хотел бы, чтобы все сообщения возвращались, но мне нужны только те избранные, которые относятся к текущему пользователю. то есть, если сообщение не пользуется привилегией текущего пользователя, тогда оно должно появляться, но не содержит никаких избранных объектов. Если публикация помечена текущим пользователем и несколькими другими пользователями, должен показать только любимый пользователь. – mgoldwasser