我希望在对数据进行分组后对其进行随机化。我怎样才能以优雅的方式实现这一目标?
我在这里创建了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()
这使数据随机化,但不对它们进行分组。
答案 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来获得真实的期望结果。
答案 2 :(得分:0)