加入两个查询 SQLAlchemy

时间:2020-12-30 18:53:48

标签: python sqlalchemy

我需要连接两个查询并从两个查询中获取所有列,但返回的对象仅包含左侧查询中的列。

get_list_best_pricesget_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

0 个答案:

没有答案