2010-05-21 2 views
7

내가 2 행 무작위로 선택된 거리마다 얻을이 테이블 같은 쿼리 어떻게 MySQL의 테이블각 그룹에 고정 된 수의 행을 선택하려면 어떻게합니까? 여기

a b distance 
15 44 250 
94 31 250 
30 41 250 
6 1 250 
95 18 250 
72 84 500 
14 23 500 
55 24 500 
95 8 500 
59 25 500 
40 73 500 
65 85 500 
32 50 500 
31 39 500 
22 25 500 
37 11 750 
98 39 750 
15 57 750 
9 22 750 
14 44 750 
69 22 750 
62 50 750 
89 35 750 
67 65 750 
74 37 750 
52 36 750 
66 53 750 
82 74 1000 
79 22 1000 
98 41 1000 

몇 가지 예를 들어 데이터입니까?

성공적인 쿼리는

a b distance 
    30 41 250 
    95 18 250 
    59 25 500 
    65 85 500 
    15 57 750 
    89 35 750 
    79 22 1000 
    98 41 1000 

답변

5

사용처럼 뭔가를 생성합니다 :

SELECT x.a, 
     x.b, 
     x.distance 
    FROM (SELECT t.a, 
       t.b, 
       t.distance 
       CASE 
       WHEN @distance != t.distance THEN @rownum := 1 
       ELSE @rownum := @rownum + 1 
       END AS rank, 
       @distance := t.distance 
      FROM TABLE t 
      JOIN (SELECT @rownum := 0, @distance := '') r 
     ORDER BY t.distance --important for resetting the rownum variable) x 
WHERE x.rank <= 2 
ORDER BY x.distance, x.a 
+0

+1 나를 이길! – Seb

+0

종종 답변을 읽는 교육입니다. 행을 임의로 선택하는 방법은 무엇입니까? – mdma

+0

@mdma : 행은 거리 값에 따라 순서가 정해져 있기 때문에 무작위로 순위가 매겨집니다. 모든 & b 값 쌍은 1 등으로 랭크 될 수 있습니다. 'ORDER BY t.distance'는 거리 값을 그룹화 된 상태로 유지하기위한 것입니다 CASE 문은 새로운 거리 값을 만나면 rownum 값을 1에서 시작하도록 다시 설정합니다. –

0

한 가지 방법은 조합을 사용하는 것입니다. 마찬가지로 :

(SELECT a, b, distance FROM table WHERE distance = 250 LIMIT 2 ORDER BY RAND()) 
UNION 
(SELECT a, b, distance FROM table WHERE distance = 500 LIMIT 2 ORDER BY RAND()) 
... 
ORDER BY distance 

별개 = /를 사용하여 하나의 쿼리로 각각 하나를 얻는 방법을 생각할 수 있지만, 내가 말한 것처럼 하나만 가져올 수 있습니다.

+0

'UNION ALL '을 사용하면 제거 할 복제본이 없을 것입니다. 또한 'ORDER BY RAND()'는 확장되지 않습니다. http://stackoverflow.com/questions/1823306/alerternative-to-mysql-order-by-rand –

0

이것이 효과가 있을까?

SELECT 
    a,b,distance 
FROM YourTable t2 
    WHERE ROW(a,b,distance) IN 
    (
     SELECT a,b,distance FROM YourTable t1 
     WHERE t1.distance=t2.distance ORDER BY RAND() LIMIT 2 
    ) 

편집 : 불행히도 아닙니다. LIMIT는 하위 쿼리에서 지원되지 않습니다.

관련 문제