select que from Question que order by RAND()
의 문제점은 DB가 하나의 항목을 반환하기 전에 모든 레코드를 정렬한다는 것입니다. 따라서 대형 데이터 세트에서는 비용이 많이 듭니다. 당신이 하나를 선택 곳에서 레코드의
- 찾기 총 :
이 목표를 달성하기 위해 싼 방법은 두 단계로 구성되어 있습니다.
- 이 세트의 임의 항목 하나를 가져옵니다. 다행히도 ...
을
select count(*) from question;
// using any programming language, choose a random number between 0 and count-1 (let's save this number in rdn), and finally
select * from question LIMIT $rdn, 1;
이 좋아,하지만 봄의 데이터에서 일부 기본 쿼리를 만들 필요가 있다고 할 :
는 MySQL의 예를 들면, 당신이 할 수있는 것을해야 할 일 우리는이를 해결하기 위해 페이지 매김을 사용할 수 있습니다.
Long count();
Page<Question> findAll(Pageable pageable);
을 그리고 당신은 사용자 수 귀하의 서비스에 다음과 같은 방법으로 당신의 저장소 : 저장소 인터페이스에서, 방법 (일부 저장소 필요없이이 문제를 가지고 그것을 정의하는) 만들
는
public Question randomQuestion() {
Long qty = questionRepository.countAll();
int idx = (int)(Math.random() * qty);
Page<Question> questionPage = questionRepository.findAll(new PageRequest(idx, 1));
Question q = null;
if (questionPage.hasContent()) {
q = questionPage.getContent().get(0);
}
return q;
}
이 하나입니다 (a) 정확히 * 내가 필요로하는 것, (b) Google과 내가 원격으로 닫을 수없는 것을 찾을 수 없었던 완벽한 해답. 하지만 당신은 오타가 있다고 생각합니다. "countAll()"이 "count()"가되어서는 안됩니까? – fivedogit