需要帮助构建一个SQLAlchemy查询+子查询。

5

这是我需要SQLAlchemy通过其ORM生成的SQL。

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实现的内容。
基本上,已登录的学生应该看到一个已保存笔记的列表。然而,学生只能看到自己发布的或者是他们其中一个同学发布的笔记-但是仅限于在笔记保存后被添加为好友的同学。
这样,学生就不会看到其他同学在他们成为好友之前发布的笔记。
然而,我在使用SQLAlchemy的ORM时遇到了麻烦。请帮忙解决一下吗?
2个回答

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()

(也未经测试,可能与实际查询不兼容,但只是为了让您有个想法。)

0

这可能是因为查询存在问题。

看起来您想查看所有学生ID的笔记,其中date_peer_saved >= date_note_saved

问题在于表notespeers可能与student存在多对一的关系。这意味着您正在尝试过滤可能有许多笔记和许多同伴进行比较的peers记录。

您需要以这样的方式连接所有三个表,以便peers的每个记录都与notes的单个记录相关联。如果这不适用于您,则需要重新考虑您真正要求的内容。

也许您想要过滤date_peer_saved的MAX >= date_note_saved的MAX?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接