分组后的随机数据

时间:2014-06-17 05:49:52

标签: mysql sql random group-by

我希望在对数据进行分组后对其进行随机化。我怎样才能以优雅的方式实现这一目标?

我在这里创建了SQLFiddle Demo

预期结果

金,金2,金3,银3,银,铜

金2,金3,金,银,银3,青铜

黄金,黄金3,黄金2,银,银3,青铜

青铜,银3,银,金2,金,金3等......

简而言之,它应该首先按字母顺序(名称)对它们进行分组,然后随机分组内部分组数据

我试过了,

  

SELECT * FROM type ORDER BY name,RAND()

这是按名称排序,但不随机化。

  

SELECT * FROM type GROUP BY name ORDER BY RAND()

这使数据随机化,但不对它们进行分组。

3 个答案:

答案 0 :(得分:2)

使用substring_index(col, ' ', 1)将字符串值拆分为单个空格分隔符并获取第一个标记,并将其用作第一个订单条件。在您的第二个订单标准上使用rand(),以便具有相同第一个单词的名称被随机化

select name
from type
order by substring_index(name, ' ', 1), rand()

此处的假设是您的名称列上的单词始终由单个空格分隔

修改
以下是substring_index上的更多示例:

select substring_index('hello world', ' ', 1); -- 'hello'
select substring_index('hello', ' ', 1); -- 'hello'
select substring_index('hello_world foo', ' ', 1); -- 'hello_world'
select substring_index('yippie ki yay', ' ', 2); -- 'yippie ki'

答案 1 :(得分:1)

试一试,如果您知道要订购的substr中的最大字符数,则name会提高效果:

SELECT * FROM type ORDER BY substr(name,1,4), rand();

从@ gerrytan上面的回答中,使用substring_index来获得真实的期望结果。

SQLFiddle Demo

答案 2 :(得分:0)

TRY

SELECT * FROM `type` ORDER BY `name`, `name` RLIKE '^.[:num]+$', RAND();

SQL DEMO