2010-05-21 39 views
7

Dưới đây là một số dữ liệu ví dụ trong một bảng mysqlLàm cách nào để chọn số hàng cố định cho mỗi nhóm?

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 

Làm thế nào để truy vấn bảng này như vậy mà tôi nhận được 2 hàng mỗi khoảng cách được lựa chọn một cách ngẫu nhiên?

Một truy vấn thành công sẽ tạo ra một cái gì đó giống như

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 

Trả lời

5

Sử dụng:

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 Hãy đánh bại tôi! – Seb

+0

Thường thì giáo dục đọc câu trả lời của bạn. Các hàng được chọn ngẫu nhiên như thế nào? – mdma

+0

@mdma: Các hàng được xếp hạng ngẫu nhiên bởi vì chúng chỉ được sắp xếp theo giá trị khoảng cách - bất kỳ cặp giá trị a & b nào có thể được xếp hạng là 1, v.v. 'ORDER BY t.distance' chỉ để giữ các giá trị khoảng cách được nhóm lại , do đó, câu lệnh CASE sẽ đặt lại chính xác giá trị rownum để bắt đầu lúc 1 khi gặp phải một giá trị khoảng cách mới. –

0

Một cách sẽ được sử dụng kết hợp. Giống như vậy:

(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 

Tôi có thể nghĩ cách nhận một truy vấn với một truy vấn bằng cách sử dụng riêng biệt = /, nhưng như tôi đã nói sẽ chỉ mang đến cho bạn.

+0

Sử dụng 'UNION ALL' sẽ tốt hơn, thấy rằng sẽ không có bản sao bị xóa. Ngoài ra, 'ORDER BY RAND()' không mở rộng tốt: http://stackoverflow.com/questions/1823306/alerternative-to-mysql-order-by-rand –

0

Tôi tự hỏi điều này có hiệu quả không?

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 
    ) 

EDIT: không may là không. LIMIT không được hỗ trợ trong truy vấn phụ.

Các vấn đề liên quan