2012-12-14 3 views
6

열 이름이 category 인 MySQL 테이블이 있습니다. 각 category에서 2 개의 임의의 레코드를 반환하는 쿼리를 작성하려고합니다. 일부 샘플 데이터와 위의 쿼리와 테이블을 볼 수MySQL의 각 'group by'카테고리에서 임의의 수의 임의의 행을 검색하십시오.

SELECT e1.* 
FROM entries AS e1 
WHERE (SELECT Count(*) 
     FROM entries AS e2 
     WHERE e2.category = e1.category 
       AND e1.rating <= e2.rating) <= 2 
ORDER BY category, 
      rating DESC 

확인이 링크 아웃 : 여기

내가 내 rating 열에서 가장 높은 값으로 각 category에서이 개 기록을 얻기 위해 사용하는 코드입니다 : http://sqlfiddle.com/#!9/bab8e/1

+1

각 카테고리에서 임의의 레코드가 필요합니다. 또는 뭔가, 당신이 포함 된 쿼리와 관련이 있습니다 ..!? – Chella

+0

쿼리는 내가 작업하고있는 것을 보여주기 위해 각 카테고리의 테이블 10 개에 30 개 항목이 있다고 말하면서 각 카테고리의 2 개의 임의 항목을 검색하고 싶습니다. 그러면 6 개의 결과가 반환됩니다. – Ivar

+0

이 게시물을보십시오 : http://stackoverflow.com/questions/984396/how-to-get-mysql-random-integer-range – ntgCleaner

답변

1

카테고리 열과 임의의 숫자로 테이블을 정렬하여 원하는 결과를 얻었습니다. 그런 다음 카테고리가 변경 될 때마다 1에서 시작하는 각 행에 증가하는 숫자를 지정했습니다. 그런 다음 rowNum이 2보다 작거나 같은 결과 만 반환합니다. 임의의 행 3 개를 반환하려면 3보다 작거나 같게 변경하면됩니다. http://sqlfiddle.com/#!9/bab8e/37/0


이 같은 쿼리가 쉽게되지 않습니다 레코드 세트의 수를 반환하기 위해 조정될 수 있습니다 마십시오 여기

SELECT entry_id, 
     category, 
     rating 
FROM (SELECT @currank := IF(@category = category, @currank + 1, 1) AS rowNum, 
       @category := category         AS categoryVar, 
       e1.* 
     FROM (SELECT *, 
         (SELECT @currank := 0) r 
       FROM entries 
       ORDER BY category, 
          Rand()) AS e1)AS e2 
WHERE rownum <= 2 
ORDER BY category, 
      rating; 

는 질문에 게시 한 같은 sqlfiddle 링크입니다 무작위. 각 category에서 상위 5 rating의를 반환하려는 경우 예를 들어,

ORDER BY category,rand()

ORDER BY category, rating DESC

및 변경

WHERE rownum <= 2

을 변화시킬 수

WHERE rownum <= 5

관련 문제