簡體   English   中英

將兩條 sqlalchemy 語句合二為一

[英]Combine two sqlalchemy statements into one

我想從我的數據庫中檢索一條記錄,這是一個問題(我正在構建一個測驗機制)。 我對此命中有以下要求:

  1. 這應該是用戶當前正在玩的測驗中的問題
  2. 它應該是用戶以前沒有回答過的問題,例如; 它不應該是響應表中的記錄
  3. 問題應按類別排序。

涉及以下模型:

問題:包含所有測驗的所有問題

class Questions(db.Model):
# table name
__tablename__ = "questions"

id = db.Column(db.Integer, primary_key=True)
quiz_id = db.Column(db.Integer, ForeignKey("quizzes.id"))
text = db.Column(db.String(80))
category = db.Column(db.Integer)
type = db.Column(db.String(80))

回復:包含所有回復

class Responses(db.Model):
# table name
__tablename__ = "responses"

id = db.Column(db.Integer, primary_key=True)
session_id = db.Column(db.Integer, ForeignKey("sessions.id"))
question_id = db.Column(db.Integer, ForeignKey("questions.id"))
option_id = db.Column(db.Integer, ForeignKey("options.id"))
answer = db.Column(db.String(80), nullable=True)

響應:當用戶開始測驗時,會話開始。 該會話與正在播放的測驗相關,以便能夠收集問題,並存儲和關聯對用戶的響應。

class Sessions(db.Model):
__tablename__ = "sessions"

id = db.Column(db.Integer, primary_key=True)
quiz_id = db.Column(db.Integer, ForeignKey("quizzes.id"))
user_id = db.Column(db.Integer, ForeignKey("users.id"))e here

對於第一個和第三個要求,我寫了以下代碼:

question = Questions.query.filter(Questions.quiz_id == quiz.id).order_by(Questions.category).first()

這在某種意義上是有效的,它以正確的順序返回問題

對於第二個要求,我寫了以下內容:

    check = Responses.query.filter(Responses.session_id == session[0].id,
                                   Responses.question_id == question.id).scalar() is not None

接下來我嘗試創建一個查詢,但這並不成功。 見下面的代碼:

question = db.session.query(Questions, Responses).filter(Questions.quiz_id == quiz.id).filter(
        Responses.session_id == session[0].id, Responses.question_id == Questions.id).order_by(Questions.category).scalar() is None
    

結果是它實際上只給了我已經回答的問題,而不是未回答的問題。 我也不確定它是否會過濾正確的 question_id。

編輯:我想我知道有正確的 SQL 調用

SELECT * FROM quiz.questions JOIN quiz.quizzes ON quiz.questions.quiz_id = quiz.quizzes.id WHERE quiz.quizzes.year = 2020 AND quiz.questions.id NOT IN (SELECT question_id FROM quiz.responses WHERE quiz.responses.session_id = 11 ) ORDER BY quiz.questions.category ASC;

您可以使用except來組合兩個查詢; 這將運行兩個查詢,並排除第二個查詢的結果(即 query1 問題 - query2 問題):

例如:

# get questions from the current quiz
Questions.query.filter(Questions.quiz_id == quiz.id).\
except(
  # except for questions with a response in the current session 
  Questions.query.filter(
    Questions.quiz_id == quiz.id,
    Questions.id == Responses.question_id,
    Responses.session_id == session[0].id
  )
).order_by(Questions.category).first()

最后,這是解決方案:

        question = Questions.query\
        .filter(Questions.quiz_id == quiz.id) \
        .filter(Responses.session_id == session[0].id) \
        .filter(Responses.question_id != Questions.id) \
        .order_by(Questions.category) \
        .order_by(func.rand()) \
        .first()

暫無
暫無

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

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