首页 > 解决方案 > 需要帮助将带有自连接的 MySQL 查询转换为 SQLAlchemy

问题描述

这是查询,到目前为止我会发布我的工作,但我确定它没有用。这里的目标也是避免子查询,这是性能非常重要的情况。

我的 MySQL 查询:

SELECT o.id FROM orders o
    JOIN cart_items ci ON (o.cart_id = ci.cart_id)
    LEFT JOIN cart_items cii ON (cii.cart_id = ci.cart_id AND cii.stage <> 'crowdfunding') 
    WHERE cii.cart_id IS null AND ci.stage = 'crowdfunding';

伪代码中的数据:

Order {
    id: Integer(primary_key(True))
    cart_id: Integer(foreign_key(Cart.id))
}
Cart {
    id: integer(primary_key(True))
}
CartItem {
    id: integer(primary_key(True))
    cart_id: integer(foreign_key(Cart.id))
}

到目前为止,我的 SQLAlchemy 查询得到了什么:

        def get_orders_for_stage_q(stage):
            join_subq = model.Session.query(ci).\
                join(
                    cii,
                    (cii.cart_id == ci.cart_id and cii.stage != stage),
                    isouter=True
                ).\
                filter(
                    cii.cart_id == None,
                    ci.stage == stage
                ).subquery()

            q = model.Session.query(model.Order.id).\
                join(join_subq, model.Order.cart_id == join_subq.c.cart_id)

            return q

编辑:此查询为我提供了所有属于该项目的所有项目orders都有一个阶段 == 'crowdfunding'。cart_idcartscart_itemscarts

标签: mysqlsqlpython-3.xsqlalchemy

解决方案


明白了,经过验证可以在我的环境中工作。:)

            q = model.Session.query(model.Order.id).\
                join(
                    ci, model.Order.cart_id == ci.cart_id
                ).\
                join(
                    cii,
                    and_(
                        cii.cart_id == ci.cart_id,
                        cii.stage != stage
                    ),
                    isouter=True
                ).\
                filter(
                    cii.cart_id == None,
                    ci.stage == stage
                ).distinct()

推荐阅读