【发布时间】:2014-06-21 07:24:36
【问题描述】:
我目前正在使用 sqlalchemy 运行以下查询。
SELECT *
FROM
qsreport_test.JiraFehlerFreigabeReleaseTestData a
WHERE a.dtime = (
SELECT
max(dtime)
FROM
qsreport_test.JiraFehlerFreigabeReleaseTestData b
WHERE
b.key=a.key
AND
b.testplanname=a.testplanname
AND
b.priority=a.priority
)
GROUP BY
a.testplanname, a.priority
我在这里搜索,发现
SQLAlchemy - subquery in a WHERE clause
我也知道
http://docs.sqlalchemy.org/en/rel_0_9/orm/tutorial.html#using-subqueries
但我的查询仍然无法正常工作。
这是我的两个尝试。第一个可以执行,但不会给我与手动执行查询相同的结果。第二个可以执行并且现在正在工作(之前缺少括号)。
尝试 1:
subq = session.query(JiraFehlerFreigabeReleaseTestData.key, JiraFehlerFreigabeReleaseTestData.testplanname, JiraFehlerFreigabeReleaseTestData.priority, func.max(JiraFehlerFreigabeReleaseTestData.dtime).label('max_dtime')).filter(JiraFehlerFreigabeReleaseTestData.key == key).filter(JiraFehlerFreigabeReleaseTestData.dtime <= dtime).subquery()
res = session.query(JiraFehlerFreigabeReleaseTestData).filter(and_(JiraFehlerFreigabeReleaseTestData.key == subq.c.key, JiraFehlerFreigabeReleaseTestData.testplanname == subq.c.testplanname, JiraFehlerFreigabeReleaseTestData.priority == subq.c.priority, JiraFehlerFreigabeReleaseTestData.dtime == subq.c.max_dtime)).group_by(JiraFehlerFreigabeReleaseTestData.testplanname).order_by(JiraFehlerFreigabeReleaseTestData.dtime.desc()).all()
尝试 2:
b = aliased(JiraFehlerFreigabeReleaseTestData, name='b')
res = session.query(JiraFehlerFreigabeReleaseTestData).filter(JiraFehlerFreigabeReleaseTestData.dtime == (session.query(func.max(b.dtime)).filter(b.key == JiraFehlerFreigabeReleaseTestData.key).filter(b.testplanname == JiraFehlerFreigabeReleaseTestData.testplanname).filter(b.priority == JiraFehlerFreigabeReleaseTestData.priority))).group_by(JiraFehlerFreigabeReleaseTestData.testplanname,JiraFehlerFreigabeReleaseTestData.priority).order_by(JiraFehlerFreigabeReleaseTestData.dtime.desc()).all()
请告诉我我做错了什么。我的问题是我不完全明白如何在子查询中引用主查询的表。特别是因为这两个表在两个查询中都是相同的。也许有什么将我的手动 sql 查询转换为 sqlalchemy orm 语法的问题?
编辑: 我的第二个版本正在运行。我只是少了一个括号。我修复了上面的代码。 但为什么我的第一次尝试给了我不同的结果?
【问题讨论】:
标签: python mysql sql sqlalchemy subquery