해당 포스팅은 사이드 프로젝트 진행 중 겪은 크고 작은 이슈들에 대한 기록입니다.
# 참고 블로그 [https://creds.tistory.com/158]
# 랜덤 데이터 조회
SELECT * FROM [TABLE] ORDER BY RAND();
# 랜덤으로 N개의 데이터 조회
SELECT * FROM [TABLE] ORDER BY RAND() LIMIT 1;
# ORDER BY 2번 사용 시
# DESC를 먼저 수행 후, 중복 데이터 중 하나를 랜덤으로 뽑아서 사용
SELECT * FROM [TABLE] ORDER BY COLUMN1 DESC, RAND() LIMIT 1;
/*
특정 범위 상위 7개 조회
*/
@Override
public List<SimpleSearchStoreDTO> searchTop7Random(Polygon<G2D> polygon, Pageable pageable) {
final int dist = 3;
return queryFactory
.select(Projections.constructor(SimpleSearchStoreDTO.class,
store.id, store.name, store.lon, store.lat, store.phoneNumber,
store.status, store.businessTime, store.address, store.ratingTotal, store.file.uploadImageUrl
)).distinct()
.from(store)
.where(stContains(polygon), stDistance(polygon).loe(dist))
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
}
/*
특정 범위 개수 조회
*/
@Override
public Long countStoreInPolygon(Polygon<G2D> polygon) {
return queryFactory
.select(store.count())
.from(store)
.where(store.file.uploadImageUrl.isNotNull())
.where(stContains(polygon), stDistance(polygon).loe(3))
.fetchOne();
}
public List<SimpleSearchStoreDTO> searchTop7Random(double lat, double lon, double dist) {
final int size = 7; // 한 페이지 당 데이터 개수
/*
범위 생성
*/
Polygon<G2D> polygon = getPolygon(lat, lon, dist);
/*
특정 범위 개수 조회
*/
Long count = storeRepository.countStoreInPolygon(polygon);
/*
참고 블로그 - https://mine-it-record.tistory.com/141
Math.random()을 활용하여 난수를 생성
+1을 해주면 0 ~ (count / n)까지의 값이 선택됨
아니면 0 ~ (count / n) - 1까지의 값이 선택됨
*/
int pageNum = count % n != 0
? (int) (Math.random() * (count / size + 1))
: (int) (Math.random() * (count / size));
/*
페이징 정보를 넘겨줌
idx쪽의 n개 데이터를 세팅함
*/
PageRequest pageRequest = PageRequest.of(pageNum, size);
return storeRepository.searchTop7Random(polygon, pageRequest);
}