【发布时间】:2020-01-31 17:14:32
【问题描述】:
这是查询,我会发布到目前为止的工作,但我确定它没有用。这里的目标也是避免子查询,这是性能非常重要的情况。
我的 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 具有属于 carts 的 carts 的所有 cart_items 属于该 carts 项目的阶段 == 'crowdfunding'。
【问题讨论】:
-
sub-query在哪里? -
我没有,我有这个查询的一个版本,它使用子查询而不是自连接,但是这个快了大约 50%,另一个太慢了SQL炼金术。 ://
-
你想达到什么目的?帮助我们帮助您,并分享一些示例数据和期望的结果。
-
我添加了更多信息。我认为我无法再优化该查询,但如果不使用子查询,我也无法获得 SQLAlchemy 查询来达到相同的效果。 SQLAlchemy 中的子查询非常慢。 :(
标签: mysql sql python-3.x sqlalchemy