按照值进行分组 RAND()

11

如何从一组数据中随机获取一个值?

----------------
 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的不同结果。例如:

nID  val
--------
A    YYY
B    N
或。
nID  val
--------
A    XXX
B    P

可以吗?

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


2
尝试一下,看看会发生什么。这是什么?“给我惊喜!发送任何你想要的东西!”这怎么适用于 API? - duffymo
你最好学习使用标准的SQL,而不是MySQL糟糕的分组实现。 - podiluska
6个回答

3

使用子查询。

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


3
您可以使用 "order by rand()" 然后按照它们进行分组。
例如:
  SELECT nID, VAL FROM (
  SELECT nID, VAL
  FROM T1
  ORDER BY RAND()
  )AS subquery
GROUP BY nID

一个子查询是一个关系,而在SQL中的关系没有固有的顺序。从那个意义上说,在你的查询中的“ORDER BY”行没有明确定义的含义,而且MySQL的未来版本可能会简单地忽略那一行,而不违反我所知道的任何保证。因此,即使现在这样工作了,也不能保证将来仍然可以工作。 - MvG
请问您能否再详细解释一下吗?如果更高版本的MySQL将忽略ORDER BY子句,那么是否应该采用不同的方法来完成? - Sanuj
xdazz和jonnyynnoj提出的方法不受影响:它在一个查询中使用了ORDER BY RAND()并且包含了LIMIT,所以排序具有语义效果,不会被优化掉。不过,你的版本可能现在性能更好。显然,你不能同时拥有性能和保证。这个问题激发了我提出了这个问题,也许可以提供更多的选择。 - MvG
1
@MvG 播放到横屏。预测未来并不实用。这将比其他两个快得多 - RichardTheKiwi
1
所以这就是未来:我有MySQL 5.7.17,但这段代码不再起作用了。 我总是得到相同的非随机结果。 - vandroid

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 ; 

0

rand + rownum

SELECT t.*
, @rownum := @rownum+1 AS rowNum
FROM(
  SELECT nID, VAL 
  FROM T1 
  ORDER BY RAND()
) AS t, (SELECT @rownum :=0) AS R
GROUP BY nID
ORDER BY nID, rowNum

0

试一下

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

我对Sanuj的回答写的评论同样适用于你的回答。 - MvG

0

下面的解决方案与xdazzjonnyynnoj类似。但我使用了子查询来选择所有不同的ID,而不是SELECT FROM T1 GROUP BY nID。我相信性能可能会有所不同,所以也请尝试这个。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接