2011-06-13 87 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() 

(也未经测试,可能无法与此实际的查询工作,但只给你的想​​法)。