SQL Запрос с группировкой, сортировкой и случайным образом одновременно - PullRequest
3 голосов
/ 13 июля 2020
• 1000 C, заказывайте AS C, но это не совсем то, что мне нужно ..

enter image description here

Here is the problem: i would like to know if its possible to order by name and make some kind of group for each name, then by order by its Order, and then apply a final ORDER BY RAND() so you still viewing all the rows from david, mark, john and William, but in random order..

enter image description here

So every time you run the query, the order is completely random but still with some order..

enter image description here

Here is a Fiddle http://sqlfiddle.com/#! 9 / 038bd7 / 7

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Этот запрос:

select Nombre, rand() rnd 
from test 
group by Nombre

возвращает случайное число для каждого уникального имени в таблице. Присоедините его к таблице и отсортируйте сначала по этому случайному числу, а затем по Orden:

select t.* 
from test t 
inner join (select Nombre, rand() rnd from test group by Nombre) r
on r.Nombre = t.Nombre
order by r.rnd, t.Orden

См. демонстрацию . Результатов:

> Id | Nombre  | Orden
> -: | :------ | ----:
>  7 | William |  null
>  1 | Mark    |  null
>  2 | David   |     1
>  4 | David   |     2
>  3 | John    |     1
>  6 | John    |     2
>  5 | John    |     3

> Id | Nombre  | Orden
> -: | :------ | ----:
>  2 | David   |     1
>  4 | David   |     2
>  3 | John    |     1
>  6 | John    |     2
>  5 | John    |     3
>  1 | Mark    |  null
>  7 | William |  null

> Id | Nombre  | Orden
> -: | :------ | ----:
>  2 | David   |     1
>  4 | David   |     2
>  1 | Mark    |  null
>  7 | William |  null
>  3 | John    |     1
>  6 | John    |     2
>  5 | John    |     3
0 голосов
/ 13 июля 2020

Хм, я действительно думал, что это сработает, но вроде нет. Я все равно размещаю его, на случай, если он вдохновит других ...

select * from test 
  order by field(nombre,
  (select group_concat(distinct concat('\'',nombre,'\'') order by rand()) from test)
  );

Кажется, работает ...

select @i:= group_concat(distinct nombre order by rand()) from test;

select *,find_in_set(nombre,@i) n from test order by n,orden
...