【问题标题】:Flask-SQLAlchemy join and get maximal by timestampFlask-SQLAlchemy 加入并按时间戳获取最大值
【发布时间】:2020-10-05 17:16:41
【问题描述】:

我有 3 个模型

    class A(Base):
     __tablename__ = 'table_a'
     id = ...  
     title = ...
     timestamp = ... # CURRENT_TIMESTAMP
    
    
    class B(Base):
      __tablename__ = 'table_b'
      id = ...        # primary
      timestamp = ... # CURRENT_TIMESTAMP
    
      a_id = Column(Integer, ForeignKey('table_a')) # references to A model
    
    
    class C(Base):
      __tablename__ = 'table_c'
      id = ...              # primary
      timestamp = ...       # CURRENT_TIMESTAMP
    
      b_id = Column(Integer, ForeignKey('table_b')) # references to B model

示例表

table_a
id    timestamp 
1     2020-01-01 00:00:01
2     2020-07-01 12:14:12
etc...
table_b
id    a_id   timestamp 
1     1       2020-05-04 00:00:01
2     1       2020-07-01 12:14:12
3     2       2020-07-01 12:14:12
etc...
table_c
id    b_id   timestamp 
1     1       2020-06-04 00:12:01
2     2       2020-08-01 11:14:12
3     2       2020-11-01 12:14:12
etc...

所以我需要实现查询以获取每个 A 的行,其中每个 A 按时间戳(或 id)具有最新的 B,对于这个 B,我需要按时间戳获取最新的 C

id = 1 的 A 示例我将拥有

A.id = 1,B.id = 2,C.id = 3

我知道如何使用子查询通过时间戳获取最大值

        sub_c = db.session.query(
            C.b_id,
            func.max(C.timestamp).label('c_max_tmstmp')
        ).group_by(C.b_id).subquery('c_query')

        sub_b = db.session.query(
            B.a_id,
            func.max(B.id).label('max_id')
        ).group_by(B.a_id).subquery('b_query')

但我不明白如何将它们与 A 结合起来

【问题讨论】:

    标签: python sql orm sqlalchemy flask-sqlalchemy


    【解决方案1】:

    我已经尝试了下一个解决方案,但我不确定它是否真的正确或是否有任何优化

            query = (db.session
                .query(A, B, C)
                .join(sub_b)
                .filter(B.id == sub_b.c.max_id)
                .join(sub_c)
                .filter(
                    and_(
                        C.b_id == sub_b.c.max_id,
                        C.timestamp == sub_c.c.max_timestamp
                    )
                )
            )
    

    【讨论】:

      猜你喜欢
      • 2018-07-13
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 2018-01-22
      • 1970-01-01
      • 2017-05-12
      • 2021-12-03
      • 2015-06-21
      相关资源
      最近更新 更多