개발 Q&A

제목 SELECT 해서 RAND 함수 통해 랜덤으로 출력하되 어느 한 필드 기준으로 랜덤으로 추
글쓴이 AMKORDB 작성시각 2016/09/19 15:13:29
댓글 : 12 추천 : 0 스크랩 : 0 조회수 : 13147   RSS

SELECT 해서 RAND 함수 통해 랜덤으로 출력하되 어느 한 필드 기준으로 랜덤으로 출력할수 있을까요? 

 

예를들어

 

SELECT * FROM 테이블 order by category, rand();

 

이 구문이 있습니다.

 

그런데 필드 중 category 이라는 필드가 있는데

 

이 필드 정렬하면서 랜덤이 가능할까요?

 

조그만 더 자세히 하자면 

예를들어  

category 필드에 "IT", "회사" , "여행" 이렇게 있습니다. 

 

그럼 순서 정렬할때 IT 인 값들 > 여행 인 값들 > 회사 인 값들 

 

다시 새로고침하면 여행 인 값들> IT 인 값들> 회사 인 값들 

 

이렇게는 안될까요?

 다음글 php Excel 업로드시 속도 문제 ? (2)
 이전글 안드로이드 웹뷰 로그인 유지 (1)

댓글

배강민 / 2016/09/19 15:18:20 / 추천 0

그냥 상상으로 쿼리문을 만들어본다면. (안될 수도 있습니다.)

SELECT 
    *
FROM
    테이블
WHERE
    category = (SELECT category FROM 테이블 ORDER BY category, rand() LIMIT 0, 1)

위로 되지 않을까도 싶네요. 

AMKORDB / 2016/09/19 15:24:04 / 추천 0
답변 감사합니다. 그런데 여기서 LIMIT만 빼면 될것같은데 빼면 왜 오류가 나는지 ㅠ,ㅠ
배강민 / 2016/09/19 15:25:45 / 추천 0

LIMIT이 있어야지 1개를 가져오는데, 없으면 여러개를 가져오는 에러일듯한데요? 여러개를 category = 과 비교할 수가 없으니까요.

LIMIT을 빼야하는 이유가 따로 있는거라면 MAX를 해보시던가요.

kaido / 2016/09/19 15:29:06 / 추천 0
SELECT * FROM tb_category AS C
WHERE C.id  IN (
SELECT id FROM(SELECT id FROM tb_category ORDER BY RAND() LIMIT 1) AS T
)

 

 

테스트해보니 이렇게 해야 하네요.

order by rand 가 들어가면 서브 쿼리로 한번 더 감싸주고 넣어줘야 합니다.

in 으로 처리 하시면 여러개 가져오기도 문제 없습니다!

AMKORDB / 2016/09/19 15:36:40 / 추천 0

kaido님 너무 감사합니다. !!

 

 정말 죄송드리지만

 

랜덤으로 출력되나 해당 필드(category ) 데이터만 출력되네요 ㅠ,ㅠ 있는 데이터 필드값 (category )모두 출력하고싶은데 ㅠ,ㅠ

방법이 없을까요? 정말 죄송합니다 ㅠㅠ.

kaido / 2016/09/19 15:41:12 / 추천 0
SELECT * FROM tb_product AS P
Inner join tb_category AS C ON P.cate_code = C.id
WHERE C.id  IN (
SELECT id FROM(SELECT id FROM tb_category ORDER BY RAND() LIMIT 1) AS T
)

이거 찾으시는 것인가요?

AMKORDB / 2016/09/19 15:45:58 / 추천 0

kaido  >정말 죄송합니다 이걸로 해보니 필드 category 중에서 한 데이터만 출력됩니다 ㅠ,ㅠ

번거롭게 해서 죄송드립니다 ㅠ,ㅠ

kaido / 2016/09/19 15:53:23 / 추천 0

그러니깐 카테고리 데이터중에 1개의 로우 데이터만 나온다는 말씀이신것이죠?

 

그럼 리미트를 빼시면 됩니다.

SELECT * FROM tb_category AS C
WHERE C.id  IN (
SELECT id FROM(SELECT id FROM tb_category ORDER BY RAND() ) AS T WHERE id >= 1
)

 

 

팁으로 쿼리 퍼포먼스를 올리기 위해서는 조건절 아무거나 한개 정도 들어가 주는것이 더욱 빠른 쿼리를 만듭니다.

AMKORDB / 2016/09/19 15:57:36 / 추천 0

정말 감사합니다!!.

IMIT 10 으로 하니깐 되고 방금 올려주신것은 랜덤이 안되네요 ㅠ,ㅠ 한번 고민 해보겠습니다. 정말 죄송합니다. ㅠ.ㅠ

kaido / 2016/09/19 16:00:28 / 추천 0

아 실수;; order by 랑 where 랑 위치가 안맞았네요;

SELECT * FROM tb_category AS C
WHERE C.id  IN (
SELECT id FROM(SELECT id FROM tb_category WHERE id >=1 ORDER BY RAND() ) AS T
)

 

그리고 테스트 하다 알은것이...

in () 안에 limit 가 붙을경우. 전체 row 값만큼 limit를 던지면 rand() 를 무시하고 차례로 가져오네요;

limit를 제거하면 전체 값을 불러도 랜덤하게 가져오고요.

오늘 신기한거 보네요; 왜 이렇게 만들어졌지 음..; mariaDB 에서는 이렇네요.

AMKORDB / 2016/09/19 16:19:24 / 추천 0

kaido 님 limit 제거하면 랜덤하게 가져온다는데 실례지만 그렇게 안가져오네요. 오히려 limit10으로 지정해야 랜덤으로 가져오는데 이렇게하면 한정되게 불러오고 ,ㅠㅠ

AMKORDB / 2016/09/19 16:26:02 / 추천 0
SELECT 
    A.* 
FROM 
    테이블 A,
    (
        SELECT @rownum:=@rownum+1 AS seq, C.category 
        FROM 
            (SELECT DISTINCT(category) AS category FROM 테이블 ORDER BY RAND()) C, 
            (SELECT @rownum:=0) D 
    ) B 
WHERE 
    A.category=B.category 
ORDER BY 
    B.seq, RAND() 

 

해결했습니다 ㅠ,ㅠ 모두 감사합니다 kaido님 감사합니다!