2012-10-04 54 views
11

有可能得到該組的隨機值?集團按值RAND()

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

有了這個SQL:

SELECT nID, VAL FROM T1 GROUP BY nID 

我的結果總是:

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

但我想埃維的NID的diferent結果。像:

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

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

這是可能的嗎?

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

+2

試試看看。這是什麼? 「讓我感到驚訝!把你想要的東西送回去!」這如何適合API? – duffymo

+0

你最好學習使用標準化的SQL而不是MySQL的令人震驚的實現組 – podiluska

回答

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

您可以使用蘭特爲了() 然後將它們分組。

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

子查詢是一種關係,並且SQL中的關係沒有固有訂購。從這個意義上說,查詢中的ORDER BY行沒有明確的含義,未來版本的MySQL可能會忽略該行,而不會違反我所知道的任何保證。所以,即使這個工作*現在*,也不能保證這將在未來仍然有效。 – MvG

+0

你能解釋一下嗎?如果高級版本的MySQL將忽略ORDER BY子句,它應該以不同的方式完成(是嗎?)? – Sanuj

0

嘗試這個

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

[comment](http:// stackoverflow。com/questions/12725363/group-by-value-rand/12725537#comment17186874_12725537)我寫給Sanuj的回答也適用於你的。 – MvG

0

下面的解決方案是在精神上對那些從xdazzjonnyynnoj相似。但不是SELECT FROM T1 GROUP BY nID我使用子查詢來選擇所有不同的ID。我相信表現可能有所不同,所以也試試這個。

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