mysql 랜덤함수 조인 조건 0 2 738

by 포엠카라 [MySQL] 랜덤 조인 [2019.01.14 09:49:20]


안녕하세요. 아래 테이블에서 시험문제 출제시, 한 시험 순번(EXAM_ORDER)에  여러개의 문제(EXAM_NO)가 있을때 EXAM_ORDER당 한개의 문제(EXAM_NO)만 랜덤으로 출력해 주고 싶은데

그게 잘 되지를 않습니다. 고수님들 도와 주세요.

TB_EXAM_CONT 테이블(현재 들어 있는 Data)

EXAM_ID EXAM_ORDER EXAM_NO CONTENTS
1 1 1 1+1=2
1 1 2 1+2=3
1 1 3 1+3=4
1 2 1 2+1=1
1 2 2 2+2=2
1 3 1 2+3=3
1 3 2 2+4=3

제가 작성했던 쿼리문은 아래와 같습니다.

  SELECT EXAM_ID,
            EXAM_ORDER,
            EXAM_NO,
            CONTENTS
  FROM TB_EXAM_CONT  A
 WHERE A.EXAM_ID = 1
    AND A.EXAM_NO =      
       (SELECT ROUND (MIN(EXAM_NO)+(RAND()*(MAX(EXAM_NO)-MIN(EXAM_NO)))) EXAM_NO
         FROM TB_EXAM_CONT
        WHERE EXAM_ID = A.EXAM_ID        
           AND EXAM_ORDER = A.EXAM_ORDER 
      )

--최종적으로 얻고자 하는 출력 결과는 아래와 같습니다.문제번호는 랜덤으로 하나만 출력되게)

EXAM_ID EXAM_ORDER EXAM_NO CONTENTS
1 1 3 1+3=4
1 2 1 2+1=1
1 3 2 2+4=3

그럼 고수님들의 답변 부탁 드립니다.

감사합니다.

by 마농 [2019.01.14 10:24:03]
-- 1. MySQL 8.0 이상 분석함수 사용(표준)
SELECT *
  FROM (SELECT exam_id, exam_order, exam_no, contents
             , ROW_NUMBER() OVER(PARTITION BY exam_id, exam_order ORDER BY RAND()) rn
          FROM tb_exam_cont
         WHERE exam_id = 1
        ) a
 WHERE rn = 1
;
-- 2. Group By 사용(비표준 : MySQL 에서만 허용되는 Group By 구문)
SELECT *
  FROM (SELECT *
          FROM tb_exam_cont
         WHERE exam_id = 1
         ORDER BY RAND()
        ) a
 GROUP BY exam_id, exam_order
;

 


by 포엠카라 [2019.01.14 10:34:43]

마농님 정말 감사합니다.

저 쿼리는 생각도 못했습니다.

더욱더 공부를 해야 겠습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입