Как написать MySQL запрос, чтобы строки с одинаковым значением поля шли подряд, но не отсортированными?
Попустим есть таблица:
Field1 Name
------------
1 Вася
2 Петя
1 Оля
3 Олег
2 Коля
Хочу написать запрос, который выведет ВСЕ строки так, чтобы строки с одинаковым Field1 шли подряд, НО по Field1 не были отсортированы (пусть будет случайный порядок)
Например, вывод может быть таким:
Field1 Name
------------
2 Петя
2 Коля
1 Вася
1 Оля
3 Олег
Еще раз: важно, чтобы строки с одинаковым Field1 шли подряд, но сами значения Field1 были в случайном порядке.
В реальной таблице 80 миллионов строк, у которых разных значений Field1 примерно 2000.
Да, отличный вариант. Чтобы не добавлять ещё одно поле, можно использовать какую-нибудь периодическую функцию, вроде синуса или косинуса. Умножение на 3 подобрано эмпирически.
select Field1, Name from test order by cos(Field1 * 3);
+--------+-----------+
| Field1 | Name |
+--------+-----------+
| 1 | Van |
| 1 | Vasya |
| 1 | Olga |
| 3 | Oleg |
| 5 | Ivan |
| 5 | Ivan |
| 5 | Ivanus |
| 4 | Alexander |
| 4 | Ivan |
| 4 | Zebra |
| 2 | Helen |
+--------+-----------+
dk-web: в смысле, куда тыкать? В консольке набираю mysql -u username -p database_name
Затем ввожу пароль и отказываюсь в консольке MySQL. Далее почти любая команда в ответ рисует такую табличку.
таким запросом не умею.. но результат достигнут - правда на 10 именах)
$q="SELECT DISTINCT field1 FROM names ";
$res=mysql_query($q) or die ('о'.mysql_error());
$data=array();
while ($row=mysql_fetch_assoc($res)) {
$data[$row['field1']]=$row['field1'];
}
$keys=array_keys($data); //массив уникальных ключей
shuffle($keys); //случайный порядок
foreach ($keys as $key=>$value) {
$q="SELECT * FROM names WHERE field1=".$value."";
$res=mysql_query($q) or die ('о'.mysql_error());
$data_names=array();
while ($row=mysql_fetch_assoc($res)) {
$data_names[]=$row['name'];
}
$data_need[$value]=$data_names;
}
echo '<pre>';
print_r ($data_need);
echo '</pre>';