联接/附加相同结果类型的多个多对多子查询

时间:2019-03-26 14:07:43

标签: sqlalchemy

我有多个多对多关系,所有关系都与单个User类相关,并且我想根据某些设定的标准在许多表上提取不同的Users

这里User可以是多个ClubsRestaurants的成员,每个ClubRestaurant可以有许多Users一样...

club_user_table = Table('club_user_ass', db.Model.metadata,
    Column('club_id', db.Integer, db.ForeignKey('club.id')),
    Column('user_id', db.Integer, db.ForeignKey('user.id'))
)

rest_user_table = Table('rest_user_ass', db.Model.metadata,
    Column('rest_id', db.Integer, db.ForeignKey('restaurant.id')),
    Column('user_id', db.Integer, db.ForeignKey('user.id'))
)

class User(db.model):
    ...
    clubs = db.relationship('Club', back_populates='club_card_holders', secondary=club_user_table)
    restaurants = db.relationship('Restaurant', back_populates='rest_card_holders', secondary=rest_user_table)

class Club(db.model):
    ...
    club_card_holders = db.relationship('User', back_populates='clubs', secondary=club_user_table)

class Restaurant(db.model):
    ...
    rest_card_holders = db.relationship('User', back_populates='restaurants', secondary=rest_user_table)

如果俱乐部或餐厅名称是“ FooBar”,我想获得一个用户列表,那么我可以做两个单独的查询:

L1 = User.query.join(Club.club_card_holders).filter(Club.name == "FooBar").all()
L2 = User.query.join(Restaurant.rest_card_holders).filter(Restaurant.name == "FooBar").all()

因此L1L2是用户列表,但我真正想要的是纯sqlalchemy格式的L1和L2的独特(非重复元素)联合。

我是否需要使用子查询,或者可以使用另一个联接来完成?

1 个答案:

答案 0 :(得分:0)

非常简单的解决方案:

L1 = User.query.join(Club.club_card_holders).filter(Club.name == "FooBar")
L2 = User.query.join(Restaurant.rest_card_holders).filter(Restaurant.name == "FooBar")

L3 = L1.union(L2)