sql查询,可同时进行分组、排序和随机查询

3htmauhk  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(457)

我找不到任何类似的问题。

CREATE TABLE IF NOT EXISTS `test` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Nombre` varchar(50) COLLATE utf8_spanish2_ci DEFAULT NULL,
  `Orden` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci;

INSERT INTO `test` (`Id`, `Nombre`, `Orden`) VALUES
    (1, 'Mark', NULL),
    (2, 'David', 1),
    (3, 'John', 1),
    (4, 'David', 2),
    (5, 'John', 3),
    (6, 'John', 2),
    (7, 'William', NULL);

正如我们所看到的,约翰和大卫不止一行,还有一个order列,所以我们可以简单地使用order-by-name asc,order-asc进行排序,但这并不是我需要的。。

问题是:我想知道是否可以按名称排序,并为每个名称创建某种类型的组,然后按其顺序排序,然后按rand()应用最终顺序,这样您仍然可以查看david、mark、john和william的所有行,但顺序是随机的。。

所以每次运行查询时,顺序都是完全随机的,但仍然有一些顺序。。

这是一把小提琴http://sqlfiddle.com/#!9/038bd7/7号

sqougxex

sqougxex1#

此查询:

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
wd2eg0qa

wd2eg0qa2#

嗯,我真的以为这样行得通,但似乎不行。不管怎样,我都会把它贴出来,以防它能激励其他人。。。

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

相关问题