Python WHERE子句中的子查询

Python WHERE子句中的子查询,python,mysql,sql,sqlalchemy,subquery,Python,Mysql,Sql,Sqlalchemy,Subquery,我目前正在使用sqlalchemy运行以下查询 SELECT * FROM qsreport_test.JiraFehlerFreigabeReleaseTestData a WHERE a.dtime = ( SELECT max(dtime) FROM qsreport_test.JiraFehlerFreigabeReleaseTestData b WHERE b.key=a.key

我目前正在使用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
我在这里搜索,找到了

我也知道

但我仍然无法让我的查询正常工作

以下是我的两次尝试。可以执行第一个查询,但不会给出与手动执行的查询相同的结果。第二个可以执行,现在正在工作(以前缺少括号)

尝试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()
请告诉我我做错了什么。我的问题是我不完全理解如何在子查询中引用主查询的表。特别是这两个表在两个查询中都是相同的。也许有什么问题需要将我的手动sql查询转换为sqlalchemy orm语法

编辑: 我的第二个版本正在运行。我只是少了一个妄想症。我修正了上面的代码。
但是为什么我的第一次尝试给了我一个不同的结果呢?

我还没有使用SQLAlchemy,但是如果您的arn不使用子查询,也许您可以解决您的问题。看看下面的查询。未测试您的免费翻译版本;)


谢谢你的建议。你记得让我看一看不同类型联接的定义。我总是使用隐式内部联接,但显式使用它是个好主意。在尝试设置此查询时,我发现我的secsond try中缺少了一个偏执(请参阅我的原始帖子)。它现在正在工作。
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()
    SELECT a.* 
    FROM qsreport_test.JiraFehlerFreigabeReleaseTestData a 
    INNER JOIN qsreport_test.JiraFehlerFreigabeReleaseTestData b
     ON b.key = a.key
     AND b.testplanname=a.testplanname
     AND b.priority=a.priority
    GROUP BY a.testplanname, a.priority
    HAVING a.dtime = max(b.dtime)