2016-07-10 22 views
0

は、私はテーブルの次のセットを持っています最大能力、関連する情報提供者の能力の合計。 SQLAlchemyでこれを行うきれいな方法はありますか?私は以下を試しました:SQLAlchemyのサブクエリ比較

db.session.query(Job.id).filter(\ 
    db.session.query(db.func.sum(Informant.max_students)). \ 
     filter(Informant.job_id == Job.id) <= \ 
    db.session.query(db.func.count(1)).select_from(queues). \ 
     filter(queues.c.job_id == Job.id)) 

これはSELECT jobs.id FROM jobs WHERE 0 = 1のようなものです。前に似たようなクエリをうまく使っているので、私が紛失しているものがありますか?または、生のSQLを実行するのにdb.engine.executeを使用する方がよいでしょうか?

+0

「max_students」をJobに移動してみませんか?それ以降はクエリがはるかに簡単になります。 –

+0

情報提供者は、奉仕したい学生の最大量を選択するためです。完全な情報提供者の仕事を持つ情報提供者がいなくなった場合、学生は同じ職場の新しい情報提供者のために待ち行列に入れなければなりません。私は、クエリがかなり複雑であることを知っている、多分私はちょうどジョブがキューイングのために開いている場合フラグを設定します。生徒は最初に情報提供者を選択し、情報提供者がいっぱいであるかどうかを知る必要があります。そうであれば、彼らは情報提供者の仕事のために待ち行列に入れられます。 – Y4sper

+0

さて、次に何ですか?私は 'max_students'カラムを' jobs'テーブルに置くことができると思います。 'job_id'が' informants'で一意でない場合は、 'jobs'テーブルの1行にまとめることができます。あなたはとにかく、今は - SUMによってあなたの質問にします。私は '情報提供者 'の表になる必要はない。 –

答えて

0

私は正解に近いです。見つからなかった部分は、両方のサブクエリでas_scalarメソッドです。したがって、最終的なクエリは次のとおりです。

db.session.query(Job.id).filter(\ 
    db.session.query(db.func.sum(Informant.max_students)). \ 
     filter(Informant.job_id == Job.id).as_scalar() <= \ 
    db.session.query(db.func.count(1)).select_from(queues). \ 
     filter(queues.c.job_id == Job.id).as_scalar()) 
+0

自分の答えを正しい解決策としてマークすることができます。 – RazerM

+0

そのために私は22時間以上待たなければなりません... – Y4sper

関連する問題