我需要连接两个查询并从两个查询中获取所有列,但返回的对象仅包含左侧查询中的列。
get_list_best_prices
和 get_list_best_promotions
工作完美,我的问题是 get_list_best_prices_and_promotions
加入了两个查询。
get_list_best_prices
为列表 price
中的每个 ean
返回具有最低 eans
的行。这是我的左查询/表。get_list_best_promotions
为列表 promotion_price
中的每个 ean
返回具有最低 eans
的行。这是我的正确查询/表。get_list_best_prices_and_promotions
应该加入以上两个,所以我得到最好的 price
和最好的 promotion_price
class Item(db.Model):
id = db.Column(db.Integer, primary_key=True)
ean = db.Column(db.BigInteger, index=True, nullable=False)
name = db.Column(db.String(256))
url = db.Column(db.String(256))
price = db.Column(db.Float)
promotion_price = db.Column(db.Float)
@classmethod
def get_list_best_prices(cls, eans, prefix=''):
subq = db.session.query(cls.ean, func.min(cls.price).label('min_price')).filter(cls.ean.in_(eans)).group_by(cls.ean).subquery()
query = db.session.query(cls).join(subq, and_(cls.ean == subq.c.ean, cls.price == subq.c.min_price))
query = db.session.query(cls.ean.label(prefix + 'ean'), cls.url.label(prefix + 'url'), cls.price.label(prefix + 'price'), ).join(subq, and_(cls.ean == subq.c.ean, cls.price == subq.c.min_price))
return query
@classmethod
def get_list_best_promotions(cls, eans, prefix=''):
subq = db.session.query(cls.ean, func.min(cls.promotion_price).label('min_promotion_price')).filter(cls.ean.in_(eans)).group_by(cls.ean).subquery()
query = db.session.query(cls.ean.label(prefix + 'ean'), cls.url.label(prefix + 'url'), cls.promotion_price.label(prefix + 'promotion_price')).join(subq, and_(cls.ean == subq.c.ean, cls.promotion_price == subq.c.min_promotion_price))
return query
@classmethod
def get_list_best_prices_and_promotions(cls, eans):
prices = cls.get_list_best_prices(eans, prefix='pp_')
alias_item_2 = aliased(Item, name='t2')
subq_promotions = alias_item_2.get_list_best_promotions(eans, prefix='p_').subquery()
results = prices.outerjoin(subq_promotions, and_(subq_promotions.columns.p_ean == cls.ean))
return results