Нет проблем с использованием distinct
или group by
или функций агрегирования.Они необходимы в хранилище данных или в аналитическом программном обеспечении, где миллионы или записи обрабатываются в каждом запросе (миллиарды и триллионы в больших данных).
Единственные корректировки - это создание индексов на основе ваших данных и запросов.
Для вашего сканрио вам нужна функция max
.Вы должны выбрать max
из anser_id
для сгруппированных user_id, question_id
следующим образом:
РЕШЕНИЕ 1
@Query("select max(answer) from Answer answer where answer.deleted = false group by answer.userId, answer.questionId")
List<Answer> findLatestAnswersByUserQuestionNotDeleted();
Этот оператор возвращает 4 записи, потому что, еслиВы не рассматриваете удаленный ответ, последний ответ пользователя 1 в вопросе 1 становится 1.
Я не знаю, почему вы не учли это, но я буду следить за вашим вопросом, как он есть.
Из-за этого вы должны постить фильтр программно удаленным, как описано вами, так что @Query
становится:
@Query("select max(answer) from Answer answer group by answer.userId, answer.questionId")
List<Answer> findLatestAnswersByUserQuestion();
Опять у вас, по праву, 4 записи, потому что также удалено присутствует и должно бытьфильтруется программно
РЕШЕНИЕ 2 (два запроса из-за вашего требования игнорировать удаленное и не учитывать старый)
шаг 1 - findId ответов, включая удаленные (просто идентификатор):
@Query("select max(answer.id) from Answer answer group by answer.userId, answer.questionId")
List<Long> findLatestAnswersId();
шаг 2 - загрузка ответов по идентификатору без учета удаленных
List<Answer> findAllByDeletedIsFalseAndIdIn(List<Long> ids);
РЕШЕНИЕ 3 (один запрос)
@Query("select answer from Answer answer where answer.deleted = false and answer.id in (select max(inAnswer.id) from Answer inAnswer)")
List<Answer> findLastestNotDeleted()