2016-06-17 45 views
0

我有一個表包含另一個表(任務)中的實體的一些修訂版。所以每個TaskRevision行都有一個唯一的自動增加的id和對Task ID的引用。使用SQLAlchemy查找最新的兩個元素修訂版

我能找到的使用所有任務的最新版本:

 
subq = session.query(TaskRevision.task_id, func.max(TaskRevision.id).label("max_id")) \ 
       .group_by(TaskRevision.task_id).subquery() 
session.query(Task) \ 
     .join(subq, Task.id == subq.c.task_id) \ 
     .join(TaskRevision, TaskRevision.id == subq.c.max_id) \ 
     .with_entities(Task, TaskRevision) 

如何最新的兩個版本中找到,大概使用子查詢修訂?

回答

0

工作SQL是相當多:

select task_id, id from TaskRevisions where (
    select count(*) from TaskRevisions as t 
    where t.task_id = TaskRevisions.task_id and t.id <= TaskRevisions.id 
) <= 2 

經過大量的工作,這是SQLAlchemy的答案:

tr = aliased(TaskRevision) 
q = s.query(TaskRevision.task_id, TaskRevision.id, TaskRevision.title).filter(
     s.query(func.count(tr.id)) \ 
      .filter(tr.id >= TaskRevision.id) \ 
      .filter(tr.task_id == TaskRevision.task_id) \ 
      .as_scalar() <= 2) \ 
    .order_by(TaskRevision.task_id).all()