2012-10-04 53 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