2010-05-21 53 views
7

這裏是一個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 2010-05-21 22:53:12

+0

它通常是一種閱讀你的答案的教育。如何隨機選擇行? – mdma 2010-05-21 23:13:02

+0

@mdma:這些行是隨機排列的,因爲它們只是按距離值排序 - 任何a&b值對都可以排列爲1等.'ORDER BY t.distance'只是爲了保持距離值分組,因此CASE語句正確地將rownum值重新設置爲在遇到新的距離值時從1開始。 – 2010-05-21 23:20:01

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 – 2010-05-21 23:00:09

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。