2014-06-17 4 views
0

Я хочу рандомизировать свои данные после их группировки. Как я могу достичь этого элегантным способом?Рандомизированные данные после группировки

Здесь я создал SQLFiddle Demo.

Ожидаемые результаты,

Gold, Gold 2, Gold 3, Silver 3, Silver, Bronze

Gold 2, Gold 3, золото, серебро, серебро 3, бронзовый

Gold , Gold 3, Gold 2, Silver, Silver 3, бронзовый

Bronze, Silver 3, Silver, Gold 2, Gold, Gold 3 и т.д. ....

Вкратце он должен группировать их в алфавитном порядке (имя), а затем рандомизированные данные с внутренней группировкой.

Я попытался,

SELECT * FROM type ORDER BY имя, RAND()

Это сделать заказ по имени, но не рандомизации их.

SELECT * FROM type GROUP BY имя ORDER BY RAND()

Это рандомизированное данные, но их не группировка.

+0

Вы рандомизировали и снова показываете все? Почему так – diEcho

+0

Я хочу перетасовать тип в группах. – Rikesh

+0

попробуйте 'ORDER BY' name' ASC': http://sqlfiddle.com/#!2/a8b81/10 – diEcho

ответ

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' 
+0

Perfect !! Это то, что я искал. Спасибо тонну :) – Rikesh

+0

+1 для того, что я искал (substring_index) – MinhD

+0

Мне просто интересно, как это работает, заказ, создав виртуальный столбец с данными 'substring_index (name, '', 1)'? – Rikesh

1

Попробуйте это, substr принесет пользу производительности, если вы знаете максимальный характер в name вы хотите заказать:

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

И от @ gerrytan приведенного выше ответа, использование SUBSTRING_INDEX для реальной жизни желаемого результата.

SQLFiddle Demo

+0

Спасибо, что гораздо ближе. – Rikesh

Смежные вопросы