簡體   English   中英

帶外部聯接的sqlalchemy中的order_by

[英]Order_by in sqlalchemy with outer join

我有以下sqlalchemy查詢:

score = Scores.query.group_by(Scores.email).order_by(Scores.date).subquery()
students = db.session.query(Students, score.c.id).filter_by(archive=0).order_by(Students.exam_date).outerjoin(score, Students.email == score.c.email)

然后我用以下方法渲染事物:

return render_template('students.html', students=students.all())

現在,問題是我希望顯示學生的最后分數,因為其中有許多對應於每個用戶。 但是第一個似乎已返回。 我在第一個查詢中嘗試了一些排序和order_by,但沒有成功。

我如何影響和選擇“得分”中的最新結果,才能與“學生”中的相應行配對?

謝謝!

首先,您要確保子查詢僅為特定學生選擇行。 您可以使用correlate方法來做到這一點:

score = db.session.query(Scores.id).order_by(Scores.date.desc()).correlate(Students)

僅此一項無濟於事,因為您無法訪問學生。 的想法correlate是,如果你使用Students在你的子查詢,它不會將它添加到FROM列表,而是依賴於外部查詢提供它。 現在,您將要優化查詢(如果需要,可以加入條件):

score = score.filter(Students.email == Scores.email)

這將產生一個子查詢,每次僅返回單個學生的分數。 剩下的問題是,每個學生是否必須獲得多個分數。 如果是這樣,則需要對其進行限制(如果沒有,則也不需要上面的order_by部分):

score = score.limit(1)

現在,您已確保查詢返回單個標量值。 由於您是在選擇上下文中使用查詢,因此需要將其轉換為標量值:

students = db.session.query(Students, score.as_scalar()).filter_by(archive=0).order_by(Students.exam_date)

as_scalar方法是一種告訴SQLAlchemy的方法,該方法返回單個行和一列 因為否則您將無法選擇它。

注意 :如果您as_scalar ,我不確定100%是否需要該limit 嘗試一下並到期。 如果每個學生只有一個分數,那么您完全不必擔心這些東西。

關於此方法的一些提示: Query實例本身就是可迭代的。 這意味着只要您不打印它或類似的東西,就可以像列表一樣傳遞查詢,唯一的例外是它只能在訪問時(懶惰)運行,並且可以動態優化它,例如可以切片it: students[:10]只會選擇前10個學生(如果您在查詢中執行此操作,它將以LIMIT執行而不是切片列表,前者效率更高)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM