mysql - 需要帮助将带有自连接的 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_id
carts
cart_items
carts
解决方案
明白了,经过验证可以在我的环境中工作。:)
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()
推荐阅读
- javascript - 如何在 react 中使用 chartkick.js 设置轴标签颜色?
- php - Cloudflare 上的 Laravel 在表单错误时产生 502 Bad Gateway
- python - AttributeError:“Tensor”对象在自定义损失函数中没有属性“numpy”(Tensorflow 2.1.0)
- java - 使用 Try-Catch-Final
- javascript - 为 js 中的请求检索正确的 http 错误
- ios - UTC 时区到日期的字符串
- python - 将数据框/CSV 中的批量数据插入或更新到 PostgreSQL 数据库
- java - Java将私有函数移入setter
- r - R中的并排箱线图
- spring-boot - Spring Boot 函数栈上下文