2011-06-13 39 views
5

這是我需要SQLAlchemy通過其ORM生成的SQL。需要幫助構建SQLAlchemy查詢+子查詢

SELECT 
    * 
FROM 
    notes 
WHERE 
    notes.student_id == {student_id} 
    OR 
    notes.student_id IN (
     SELECT 
      * 
     FROM 
      peers 
     WHERE 
      peers.student_id == {student_id} 
      AND 
      peers.date_peer_saved >= notes.date_note_saved 
    ) 

SQL未經測試。我只是寫它來演示我需要SQLAlchemy來做什麼。

基本上,登錄的學生應該看到保存notes的列表。但是,學生應該看到的唯一的notes是由他們自己發佈的或由他們的同事發佈的那些 - 但是隻有在筆記被保存後他們「友好」的那些同伴。

這樣一來,學生將無法看到他人發佈學生的筆記,他們成爲同齡人面前。

我遇到了麻煩這在SQLAlchemy的的ORM運行,但。任何幫助?

回答

0

這可能是因爲有與查詢問題。

它看起來像你想看到一個學生編號的所有筆記date_peer_saved是> = date_note_saved

問題是表notespeers可能與student多對一的關係。這意味着您正試圖過濾peers的記錄,其中可能有很多筆記和許多對等點進行比較。

您需要以這樣的方式加入所有三個表格,即peers的每個記錄與notes的單個記錄相關。如果這不適用於你,那麼你需要重新思考你真正要求的東西。

也許要過濾的date_note_saved date_peer_saved> = MAX的MAX?

8

基本上,你可以使用.subquery()方法得到一個子查詢,你可以放入另一個條件類似。

喜歡的東西

subq = sess.query(Peers.id).filter(and_(Peers.student==student, XXX)).subquery() 

然後

notes = sess.query(Notes).filter(or_(Notes.student==student, Notes.studing.in_(subq))).all() 

(也未經測試,可能無法與此實際的查詢工作,但只給你的想​​法)。