2012-10-04 44 views
11

Có thể nhận được một giá trị ngẫu nhiên của nhóm không?Nhóm Theo giá trị RAND()

---------------- 
nID | val 
--------------- 
    A | XXX 
    A | YYY 
    B | L 
    B | M 
    B | N 
    B | P 
---------------- 

Với SQL này:

SELECT nID, VAL FROM T1 GROUP BY nID 

kết quả của tôi luôn là:

nID val 
-------- 
A XXX 
B L 

Nhưng tôi muốn có một kết quả khác nhau của evey NID. Giống như:

nID val 
-------- 
A YYY 
B N 

hoặc

nID val 
-------- 
A XXX 
B P 

Có thể?

http://sqlfiddle.com/#!2/357b8/3

+2

Hãy thử và xem. Cái gì thế này? "Gây ngạc nhiên cho tôi! Gửi lại bất cứ điều gì bạn muốn!" Điều này phù hợp với một API như thế nào? – duffymo

+0

Bạn nên học tốt hơn để sử dụng SQL chuẩn hóa hơn là triển khai kinh khủng của MySQL theo nhóm bởi – podiluska

Trả lời

2

Sử dụng truy vấn phụ.

SELECT r.nID, 
(SELECT r1.val FROM T1 r1 WHERE r.nID=r1.nID ORDER BY rand() LIMIT 1) AS 'val' FROM T1 r 
GROUP BY r.nID 

http://sqlfiddle.com/#!2/357b8/18

1
SELECT 
    t1.nID, 
    (SELECT 
    t2.var 
    FROM your_table t2 
    WHERE t1.nID = t2.nID ORDER BY rand() LIMIT 1 
) AS var 
FROM your_table t1 
GROUP BY t1.nID ; 
3

Bạn có thể sử dụng để do rand() sau đó nhóm của họ.

Giống như

SELECT nID, VAL FROM (
    SELECT nID, VAL 
    FROM T1 
    ORDER BY RAND() 
)AS subquery 
GROUP BY nID 
+0

http://sqlfiddle.com/#!2/357b8/32 – Sanuj

+0

Truy vấn con là một mối quan hệ và các quan hệ trong SQL không có vốn có gọi món. Theo nghĩa đó, dòng 'ORDER BY' trong truy vấn của bạn không có ý nghĩa rõ ràng, và các phiên bản sau của MySQL có thể đơn giản bỏ qua dòng đó, mà không vi phạm bất kỳ sự bảo đảm nào mà tôi biết. Vì vậy, ngay cả khi điều này hoạt động * ngay bây giờ *, không có gì đảm bảo rằng điều này sẽ vẫn hoạt động trong tương lai. – MvG

+0

Bạn có thể giải thích thêm một chút không ?? Nếu nó được thực hiện theo cách khác (có?) Nếu các phiên bản cao hơn của MySQL sẽ bỏ qua mệnh đề 'ORDER BY'? – Sanuj

0

Hãy thử

SELECT nID, VAL 
FROM (select nID, VAL from T1 order by rand()) as T 
group by nID 
+0

[bình luận] (http: // stackoverflow.com/questions/12725363/group-by-value-rand/12725537 # comment17186874_12725537) Tôi đã viết cho câu trả lời của Sanuj cũng áp dụng cho bạn. – MvG

0

Các giải pháp sau này là tinh thần tương tự với những từ xdazz hoặc jonnyynnoj. Nhưng thay vì SELECT FROM T1 GROUP BY nID tôi sử dụng truy vấn con để chọn tất cả các ID khác nhau. Tôi tin rằng có một cơ hội mà hiệu suất có thể khác nhau, vì vậy hãy thử cái này.

SELECT nID, 
    (SELECT VAL 
    FROM T1 
    WHERE T1.nID = ids.nID 
    ORDER BY RAND() 
    LIMIT 1 
) AS VAL 
FROM (SELECT DISTINCT nID FROM T1) AS ids 
Các vấn đề liên quan