개발노트
목록
[MySQL] Order By RAND() 랜덤으로 데이터 가져오기 및 필요한 데이터 수량 지정
랜덤추출랜덤표시베너랜덤MySQLRandRandom
MySQL 2024.04.11 110 회 읽음
MySQL 24.04.11 110



유튜브 동영상 데이터 게시물을 랜덤으로 표시하는 루틴 적용을 위해 Order By RAND() 쿼리를 이용하였습니다. 적용하고 나서 보니 데이터가 많아서 오래전에 등록한 데이터까지 랜덤으로 추출하는 문제가 발생 했네요. 이를 해결하기 위해 필요한 데이터를 추출하고 해당 범위에 글만 랜덤으로 처리하도록 하였습니다. 아래 샘플 소스를 통해 간단하게 처리하세요.



정해진 데이터 갯수 랜덤 사용하기

베너 같이 갯수가 소량 정해진 경우는 랜덤으로 표시하기 좋습니다. 1개를 추출하는 경우 LIMIT 1이라고 표시하고 5개 중에 랜덤으로 하고 싶다면 RAND() LIMIT 5 라고 쿼리를 작성할 수 있습니다. 여기에서 RAND 0,5 = RAND 5 는 동일한 결과 입니다.

# 동영상데이터 5개 표시
SELECT * FROM tbl_moviereview WHERE LENGTH(youtube)>0 ORDER BY RAND() LIMIT 5





정해진 글 중에 랜덤으로 표시

이 방법의 경우 데이터가 많은 경우 오래전에 작성한 데이터까지 랜덤으로 하여 신규 데이터로 표시해야 하는 경우가 있습니다. 해결 방법으로는 날짜를 지정하는 방법도 있지만 이런경우 지정한 기간에 데이터가 없으면 표시할 내용이 없는 오류가 있습니다. 제가 해결한 방법으로는 최신 데이터를 5개 먼저 얻고 해당 데이터에서 랜덤으로 처리하는 방법을 사용하였습니다.

/* 신규 데이터 5건을 가져온다*/
$q    = mysqli_query($connect,"SELECT * FROM tbl_moviereview WHERE LENGTH(youtube)>0 ORDER BY nm DESC LIMIT 5");
$in = ''; while($r=mysqli_fetch_array($q)){ if( $in ) $in.= ","; $in.= $r["nm"]; } /* nm IN ($in)을 통해 위에서 가져온 데이터중에 랜덤으로 추출한다.*/ SELECT * FROM tbl_moviereview WHERE LENGTH(youtube)>0 AND nm IN($in) ORDER BY RAND() LIMIT 5

베너를 사용할 때에는 문제가 없어서 모르고 있었는데 최신 동영상 슬라이드 베너를 적용하는 과정에서 오류가 있다는 것을 발견하였습니다. RAND() 명령의 주의 사항은 데이터가 많은 경우 효율이 떨어집니다. 데이터가 많은 경우 기간이나 다른 조건을 추가하여 데이터 추출에서 수량을 줄이는 노력이 필요합니다.



캡쳐한 화면은 실제 실제 적용하여 서비스 중인 사이트 입니다. 베너 영역은 기본 RAND() 쿼리를 이용하고 동영상 뉴스와 인기글과 같은 부분은 필요한 데이터에서만 랜덤으로 처리하고 있습니다. 방문자가 적은 사이트는 큰 문제가 없지만 반대의 상황이라면 쿼리에서 인덱스나 범위 지정이 중요합니다.

목록