Получение списка вопросов, на которые не было показано или на которые не были даны ответы

#sql #spring #hibernate #jpa #spring-data-jpa

#sql #spring #переход в спящий режим #jpa #spring-data-jpa

Вопрос:

У меня есть две таблицы :

Таблица вопросов, в которой содержится :

изображение

И тогда у меня есть другая таблица, которая называется

Пользовательский ответ на вопрос, содержащий :

изображение

В котором есть ссылка на вопрос через question_id

Дело в том, что каждый раз, когда пользователь отвечает на вопрос, я создаю строку в БД, в которой говорится :

идентификатор вопроса_id_пользователя ответил на него, а затем я проверяю, правильный ответ или нет, если он правильный, я помещаю passed как True, в противном случае я помещаю passed как false.

Хорошо, с этого момента все в порядке, единственное, чего я не могу получить, это то, что я создаю метод, который возвращает мне следующий вопрос без ответа, но я не могу правильно использовать этот метод.

Что я хотел бы, так это иметь запрос, который сначала возвращает все вопросы, на которые пользователь еще не ответил, а затем другой запрос, который возвращает только вопрос, на который пользователь еще не ответил.

Примечание: Этот показанный атрибут был добавлен, потому что я хочу сначала выполнить итерацию по другим вопросам вместо отображения тех, которые пользователь недавно не смог выполнить.

Ясен ли вопрос?

Что я пробовал?

Я пытался получить вопросы List<UserAnswerQuestion> findAllByUserEmailAndPassedFalseAndShownFalse(String email); , но это не работает, потому что с помощью этой таблицы я могу знать каждый ответ при каждой попытке пользователя, так что, например, если у меня есть вопрос, на который есть 4 ответа и 1 правильный, эта таблица может содержать 4 строки с одинаковым question_question_id, потому что пользователь, возможно, потерпел неудачу 3 раза, а затем на четвертый он отвечает правильно.

Редактировать

У меня уже есть вопросы, на которые пользователь может ответить с помощью этого метода :

 public List<Question> getAllQuestionsThatUserCanAnswer(String email, Long topic){
        List<Question> mList = this.questionRepository.findAllByTopicParentId(topic);
        if(mList==null) return null;
        List<UserAnswerQuestion> userAnswerQuestionList = this.userAnswerQuestionRepository.findAllByUserEmail(email);

        for (UserAnswerQuestion userAnswerQuestion : userAnswerQuestionList) {
            if(mList.contains(userAnswerQuestion.getQuestion())){
                if(userAnswerQuestion.getPassed()){
                    mList.remove(userAnswerQuestion.getQuestion());
                }
            }
        }
        return mList;
    }
  

Сейчас я пытаюсь выполнить GetNext этого метода, но я не знаю, как выполнить итерацию по нему.

Ответ №1:

Сосредоточьтесь на SQL-запросе, который решит вашу проблему

 select * from Question q
left join Answer a on q.id = a.question_id
where a.id is null OR (a.passed != 'true' AND a.user_id = 1)
order by a.passed
  

Проверьте scratch здесь