[英]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.